簡體   English   中英

鏈接共享庫后符號丟失

[英]Symbol is lost after linking shared library

考慮下面列出的兩個文件:

檔案ac

extern int foovar;
int foobarize() {
    return foovar * foovar;
}

和文件bc

int foovar = 10;

我編譯靜態庫liba.a和共享庫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

請注意該函數foobarize中定義ac 存在liba.a ,但它不存在libb.so 我可以通過發布nm程序來保證:

$ 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 __cxa_finalize@@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函數?

你需要什么:

# 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以強制將特定符號視為未定義符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM