2014-06-15 62 views
0

,需要注意以下兩個文件後丟失libb.so如下:符號是連接共享庫

# liba.a 
gcc -fPIC -c a.c -o a.o 
ar cr liba.a a.o 
ranlib liba.a 

# libb.so 
gcc -fPIC -c b.c -o b.o 
gcc -fPIC -shared -Wl,-soname,libb.so -o libb.so b.o liba.a 

注意,函數foobarizea.c定義在本liba.a存在於libb.so

$ nm liba.a 

a.o: 
0000000000000000 T foobarize 
       U foovar 
       U _GLOBAL_OFFSET_TABLE_ 

$ nm libb.so 
000000000020088c B __bss_start 
000000000020088c b completed.6617 
       w [email protected]@GLIBC_2.2.5 
0000000000000530 t deregister_tm_clones 
00000000000005c0 t __do_global_dtors_aux 
0000000000200650 t __do_global_dtors_aux_fini_array_entry 
0000000000200880 d __dso_handle 
0000000000200660 d _DYNAMIC 
000000000020088c D _edata 
0000000000200890 B _end 
0000000000000630 T _fini 
0000000000200888 D foovar 
0000000000000600 t frame_dummy 
0000000000200648 t __frame_dummy_init_array_entry 
0000000000000640 r __FRAME_END__ 
0000000000200858 d _GLOBAL_OFFSET_TABLE_ 
       w __gmon_start__ 
00000000000004d8 T _init 
       w _ITM_deregisterTMCloneTable 
       w _ITM_registerTMCloneTable 
0000000000200658 d __JCR_END__ 
0000000000200658 d __JCR_LIST__ 
       w _Jv_RegisterClasses 
0000000000000570 t register_tm_clones 
0000000000200890 d __TMC_END__ 

我怎樣才能在libb.so共享庫中foobarize功能:我可以通過發出nm程序保證?

回答

2

你需要什麼:

# force all symbols 

gcc -fPIC -shared -Wl,-soname,libb.so -o libb.so b.o \ 
      -Wl,--whole-archive liba.a -Wl,--no-whole-archive 

#force just a specific symbol 

gcc -fPIC -shared -Wl,-soname,libb.so -o libb.so b.o \ 
      -u foobarize liba.a 

爲什麼你需要:

靜態庫是目標文件的簡單集合。與一堆目標文件的一個主要區別如下:當需要解析未定義的符號時,搜索庫文件,並且只有實際定義符號的目標文件鏈接到。沒有未定義的符號?什麼都不搜索,沒有任何鏈接。爲了覆蓋這個默認行爲,GNU鏈接器實現了--whole-archive。大多數連接器實現-u以強制將特定符號視爲未確定。

+1

參見http://webpages.charter.net/ppluzhnikov/linker.html和http://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking/ –