【问题标题】:Symbols from convenience library not getting exported in executable便利库中的符号未在可执行文件中导出
【发布时间】: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


    【解决方案1】:

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

    链接器将命令行中明确指定的每个目标文件添加到二进制产品中,但它们仅从存档中提取那些在被链接代码中实际引用的目标文件。

    为了抵消这种行为,可以在 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
    

    【讨论】:

    • 在bazel中,这个对应cc_library( alwayslink=True )
    【解决方案2】:

    如果您需要 func 位于 plugin.so 中,您应该尽可能在其中找到它。便利库的目的就是为了方便链接到可执行文件或库作为中间步骤。

    【讨论】:

    • 是的,但我明确需要 func not 在插件中,因为 func 是几个插件需要调用的 API 的一部分。这些插件是在其他地方编写的,我试图避免对它们进行本地修改。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2011-01-23
    • 2011-05-08
    • 2013-04-27
    • 1970-01-01
    • 2015-08-25
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多