【问题标题】:When creating a shared library, how to tell the linker that a symbol is in the executable?创建共享库时,如何告诉链接器一个符号在可执行文件中?
【发布时间】:2018-06-13 15:28:06
【问题描述】:

我正在创建一个 apache 模块,它基本上是一个共享库(不是在 C 中,而是在 rust 中,所以我不能使用隐藏所有这些东西的常用 apache 工具)。

当我去链接时,ld 告诉我有一堆未定义的符号。这些符号都定义在将加载此共享库的可执行文件中,即/usr/sbin/httpd。我用nm 验证了这一点。我在任何其他静态或共享库中都找不到它们。

如何告诉链接器符号在 httpd 中?

这是它正在触发的缩写链接器命令:

"cc" "-m64" "-L" "/Users/me/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/me/dev/apacheagent-myco/target/debug/deps/apacheagentmyco.apacheagentmyco0.rcgu.o" ...<tons of .o files>  "-Wl,-exported_symbols_list,/var/folders/6h/qx6jssj16q95_h_kqjd6qt_00000gn/T/rustc.xMMi8AxcVg62/list"  "-Wl,-dead_strip" "-nodefaultlibs" "-L" <tons of rlibs>  "-l" "onig" "-framework" "Security" "-framework" "CoreFoundation" "-l" "System" "-l" "resolv" "-l" "pthread" "-l" "c" "-l" "m" "-dynamiclib" "-Wl,-dylib" "-lapr-1" "-laprutil-1"

以下是错误:

note: Undefined symbols for architecture x86_64:
            "_ap_is_initial_req", referenced from:
                apache2::httpd::_$LT$impl$u20$apache2..wrapper..Wrapper$LT$apache2..ffi..request_rec$GT$$GT$::is_initial_req::h078b0dbdc2d2d488 in libapache2-850bd4b18832aac1.rlib(apache2-850bd4b18832aac1.apache20.rcgu.o)
            "_ap_hook_handler", referenced from:
                apacheagentmyco::apache_agent_myco_hooks::h3461197a43567639 in apacheagentmyco.apacheagentmyco7.rcgu.o
            "_ap_server_root", referenced from:
                apacheagentmyco::myco_child_init::h52c8c1513f7742ef in apacheagentmyco.apacheagentmyco7.rcgu.o
            "_ap_get_brigade", referenced from:
                apacheagentmyco::myco_apache2::apache2_body::read_body::h41bdc64c0c81a6d6 in apacheagentmyco.apacheagentmyco15.rcgu.o
          ld: symbol(s) not found for architecture x86_64
          clang: error: linker command failed with exit code 1 (use -v to see invocation)

这些符号都在/usr/sbin/httpd中。

【问题讨论】:

  • 所以从一个共享库中,您在调用相同共享库的可执行文件中使用符号?不知道rust,我还是想知道链接命令是什么。它可能是给 ld 的对象的排序。
  • 这是特定于平台和工具链的。但是,作为第一个猜测,请确保您将模块编译为共享库,而不是可执行文件。在许多(但不是全部)平台上,共享库允许有未定义的符号。
  • @JohnBollinger mac 不允许,但在阅读了您的评论后,我环顾四周,发现了一个忽略特定符号而不是全局允许未定义符号的标志:-Wl,-U,_symbol。这样就解决了。

标签: c macos linker ld undefined-symbol


【解决方案1】:

如何告诉链接器符号在 httpd 中?

您不需要:默认情况下,UNIX 链接器假定共享库将具有未解析的符号。

您的问题似乎是:链接行上缺少-shared 标志(没有它,链接器正在尝试链接可执行文件,而不是您要链接的共享库)。

附:建议使用-nodefaultlibs。你应该永远使用它,除非你知道你在做什么。

【讨论】:

  • 谢谢。我发现 macos 链接器并不完全遵循其他 unix 默认执行的操作。添加-undefined dynamic_lookup 似乎也有效。
【解决方案2】:

仅供参考,以防其他人遇到同样的问题,我通过告诉链接器忽略特定符号来解决这个问题。

... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root  

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 2017-02-24
    • 2013-09-12
    • 2012-07-06
    • 2023-03-15
    • 2023-02-24
    • 2012-08-05
    • 2013-05-11
    相关资源
    最近更新 更多