gpt4 book ai didi

linux - 便利库中的符号未在可执行文件中导出

转载 作者:IT王子 更新时间:2023-10-29 00:34:13 25 4
gpt4 key购买 nike

我有一个程序,myprogram,它与一个静态便利库链接,称之为libconvenience.a,其中包含一个函数,func() myprogram 中的任何地方都没有调用函数 func();它需要能够从插件库 plugin.so 中调用。

func() 符号未在 myprogram 中动态导出。如果我跑

nm myprogram | grep func

我一无所获。但是,libconvenience.a 中并没有缺少它:

nm libconvenience/libconvenience.a | grep func
00000000 T func

我正在使用 automake,但如果我改为在命令行上手动执行最后一步链接,它也不起作用:

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`

但是,如果我像这样链接程序,跳过便利库的使用并直接链接将进入 libconvenience.a 的目标文件,func() 应该出现在 myprogram 的符号中:

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`

如果我在 myprogram 的某处添加对 func() 的虚拟调用,那么 func() 也会出现在 myprogram 的符号。但我认为 --export-dynamic 应该导出所有符号,无论它们是否在程序中使用!

我在 Fedora 14 上使用 automake 1.11.1 和 gcc 4.5.1。我还使用 Libtool 2.2.10 构建 plugin.so(但不是便利库。)

我没有忘记把 -Wl,--export-dynamic 放在 myprogram_LDFLAGS 里,也没有忘记把包含 func( )libconvenience_a_SOURCES 中(一些谷歌搜索表明这些是导致此问题的常见原因。)

有人可以帮助我了解这里发生了什么吗?

最佳答案

我设法解决了它。正是 John Calcote 出色的 Autotools 书中的这条注释为我指明了正确的方向:

Linkers add to the binary product every object file specified explicitly on the command line, but they only extract from archives those object files that are actually referenced in the code being linked.

为了抵消这种行为,可以使用 libtool 的 --whole-archive 标志。但是,这会导致所有系统库中的所有符号也被拉入,从而导致大量双符号定义错误。所以 --whole-archive 需要在链接器命令行的 libconvenience.a 之前,并且需要跟在 --no-whole- archive 这样其他库就不会被那样对待。这有点困难,因为 automake 和 libtool 并不能真正保证您的标志在命令行中保持相同的顺序,但是 Makefile.am 中的这一行起到了作用:

myprogram_LDFLAGS = -Wl,--export-dynamic \
-Wl,--whole-archive,libconvenience/libconvenience.a,--no-whole-archive

关于linux - 便利库中的符号未在可执行文件中导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4175802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com