2013/07/21

library 實作範例 ...

之前有一篇文章再介紹library
有興趣的朋友可以點上述的連結去了解
這邊用個簡單的範例來說明
首先我們先建立一個test的執行檔
# vim main.c
  #include <stdio.h>
  int main()
  {
    printf("Hello world!!!\n");
    return 0;
  }
# gcc main.c -o test
這時我們會有一個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的指令了
因為沒有連結動態的函式庫

沒有留言:

張貼留言