有興趣的朋友可以點上述的連結去了解
這邊用個簡單的範例來說明
首先我們先建立一個test的執行檔
# vim main.c這時我們會有一個test的執行檔#include <stdio.h> int main() { printf("Hello world!!!\n"); return 0; }# gcc main.c -o test
這個執行檔的大小是4642
接著我們使用file來看看這個執行檔的資訊
# file test test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped可以從上面的描述得知
- 這是一個32bit的Linux執行檔 (32-bit LSB executable)
- 可以在intel 80386的硬體環境下執行 (Intel 80386)
- 使用動態的library (dynamically linked (uses shared libs))
- 在linux 2.6.32的作業系統上 (GNU/Linux 2.6.32)
- 還沒有stripped (可以用 strip的指令去除一些debug的資訊,讓檔案變小[4642 --> 3000])
如果想要看一下這個檔案用到哪些的動態library
而且可以看出這些dynamic library之間的相依性
# ldd test linux-gate.so.1 => (0x00614000) libc.so.6 => /lib/libc.so.6 (0x00697000) /lib/ld-linux.so.2 (0x00676000)可以知道有用到兩個函式庫 :
- libc.so.6 : 標準C函式庫
- ld-linux.so.2 : 提供基本的library給其他的library,這個library為static library
那如果我們要用靜態的函式庫要如何做呢?
很簡單,在compile的時候加入-static的參數
# gcc -static main.c -o test_static這時test_static的檔案大小就會飆升到632124
這是用file去看這個檔案的資訊就會變成statically linked
# file test_static test_static: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, not stripped這個檔案就無法使用ldd的指令了
因為沒有連結動態的函式庫
沒有留言:
張貼留言