【发布时间】:2010-11-14 01:58:08
【问题描述】:
我有一个程序myprogram,它与一个静态便利库链接,称之为libconvenience.a,其中包含一个函数func()。 func() 函数不会在 myprogram 中的任何地方调用;它需要能够从插件库中调用,plugin.so。
符号func() 未在myprogram 中动态导出。如果我跑
nm myprogram | grep func
我什么也得不到。但是,libconvenience.a 并没有丢失它:
nm libconvenience/libconvenience.a | grep func
00000000 T函数
我正在使用 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(一些谷歌搜索表明这些是导致此问题的常见原因。)
有人可以帮我理解这里发生了什么吗?
【问题讨论】:
标签: linux gcc linker autotools