我正在创建一个apache模块,它基本上是一个共享库(不是在C中,但在生锈中,所以我不能使用通常的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中。
如何告诉链接器符号在httpd中?
您不需要:默认情况下,UNIX链接器假定共享库将具有未解析的符号。
您的问题似乎是:链接行上缺少-shared
标志(没有它,链接器正在尝试链接可执行文件,而不是您要链接的共享库)。
附:使用-nodefaultlibs
是不明智的。除非你知道自己在做什么,否则不应该使用它。
只是为了将来参考以防其他人遇到同样的问题,我通过告诉链接器忽略特定的符号来解决这个问题。
... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root