C 创建共享库时,如何告知链接器可执行文件中有符号?
我正在创建一个apache模块,它基本上是一个共享库(不是C语言,而是rust语言,所以我不能使用通常的apache工具来隐藏所有这些东西) 当我转到link时,C 创建共享库时,如何告知链接器可执行文件中有符号?,c,macos,linker,ld,undefined-symbol,C,Macos,Linker,Ld,Undefined Symbol,我正在创建一个apache模块,它基本上是一个共享库(不是C语言,而是rust语言,所以我不能使用通常的apache工具来隐藏所有这些东西) 当我转到link时,ld告诉我有一堆未定义的符号。这些符号都在将加载此共享库的可执行文件中定义,即/usr/sbin/httpd。我用nm验证了这一点。我在任何其他静态或共享库中都找不到它们 如何告诉链接器符号在httpd中 下面是它正在触发的一个缩写链接器命令: "cc" "-m64" "-L" "/Users/me/.rustup/toolchains
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"
这些符号都在/usr/sbin/httpd中
如何告诉链接器符号在httpd中
您不需要这样做:默认情况下,UNIX链接器假定共享库将具有未解析的符号
您的问题似乎是:链接行上缺少-shared
标志(没有该标志,链接器将尝试链接可执行文件,而不是要链接的共享库)
另外,使用
-nodefaultlibs
是不明智的。除非你知道自己在做什么,否则千万不要使用它。仅供将来参考,以防其他人也有同样的问题,我告诉链接器忽略特定的符号来解决这个问题
... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root
那么从共享库中,您在调用相同共享库的可执行文件中使用符号?不知道生锈,我仍然想知道链接命令是什么。它可能是给定给ld的对象的顺序。这是特定于平台和工具链的。不过,作为第一个猜测,请确保您将模块编译为共享库,而不是可执行文件。在许多(但不是所有)平台上,共享库允许有未定义的符号。@JohnBollinger mac不允许,但在阅读您的评论后,我四处查看,发现一个标志可以忽略特定符号,而不是全局允许未定义的符号:
-Wl,-U,\U symbol
。这就解决了,谢谢。我发现macos链接器在默认情况下并不完全遵循其他Unix的做法。添加-未定义的动态\u查找也似乎有效。
... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root