apache - 使用 LLVM Plus 自定义 channel 和自定义库编译 Apache Server

标签 apache compiler-construction linker clang llvm

我们想使用 LLVM 来编译 apache 2.2.19。在编译过程中,我们希望通过指定 CFLAGS 环境变量来向 clang 添加自定义传递:

CFLAGS="-Xclang -load -Xclang mypass.so"

然后,在链接步骤中,我们还希望将可执行文件与一个自定义动态库链接。所以我们导出了这两个环境变量:

LDFLAGS="-L. -lmylib"
LD_LIBRARY_PATH='./libfolder'

我们在编译 MySQL 时使用了这些环境变量,并且它按预期工作。然而,在编译apache时,我们遇到了以下错误:

/usr/bin/ld: cannot find -load

链接器似乎还读取编译器标志,然后将 -load 解释为库...您能告诉我如何摆脱这个问题吗?

以下是更多详细信息:

这是我用来配置 apache 的命令:

CC=clang CXX=clang++
CFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so" 
CXXFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so"
LDFLAGS="-ldl -L/home/my/Projects/lib/ -lmylib"
LD_LIBRARY_PATH="/home/my/Projects/lib/"
./configure

我运行make后的错误在这里:

/bin/bash /home/my/Downloads/httpd-2.2.19/srclib/apr/libtool --silent --mode=link
clang -Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so 
-DHAVE_CONFIG_H -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE
-I./include -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix
-I./include/arch/unix -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix
-I/home/my/Downloads/httpd-2.2.19/srclib/apr/include  -version-info 4:5:4   --verbose -ldl
-L/home/my/Projects/lib/ -lmylib-o libapr-1.la
-rpath /usr/local/apache2/lib passwd/apr_getpass.lo strings/apr_cpystrn.lo
strings/apr_fnmatch.lo strings/apr_snprintf.lo strings/apr_strings.lo
strings/apr_strnatcmp.lo strings/apr_strtok.lo tables/apr_hash.lo
tables/apr_tables.lo atomic/unix/builtins.lo atomic/unix/ia32.lo
atomic/unix/mutex.lo atomic/unix/ppc.lo atomic/unix/s390.lo
atomic/unix/solaris.lo dso/unix/dso.lo file_io/unix/buffer.lo
file_io/unix/copy.lo file_io/unix/dir.lo file_io/unix/fileacc.lo file_io/unix/filedup.lo
file_io/unix/filepath.lo file_io/unix/filepath_util.lo file_io/unix/filestat.lo
file_io/unix/flock.lo file_io/unix/fullrw.lo file_io/unix/mktemp.lo file_io/unix/open.lo
file_io/unix/pipe.lo file_io/unix/readwrite.lo file_io/unix/seek.lo
file_io/unix/tempdir.lo locks/unix/global_mutex.lo locks/unix/proc_mutex.lo
locks/unix/thread_cond.lo locks/unix/thread_mutex.lo locks/unix/thread_rwlock.lo
memory/unix/apr_pools.lo misc/unix/charset.lo misc/unix/env.lo misc/unix/errorcodes.lo
misc/unix/getopt.lo misc/unix/otherchild.lo misc/unix/rand.lo misc/unix/start.lo
misc/unix/version.lo mmap/unix/common.lo mmap/unix/mmap.lo network_io/unix/inet_ntop.lo
network_io/unix/inet_pton.lo network_io/unix/multicast.lo network_io/unix/sendrecv.lo
network_io/unix/sockaddr.lo network_io/unix/socket_util.lo network_io/unix/sockets.lo
network_io/unix/sockopt.lo poll/unix/epoll.lo poll/unix/kqueue.lo poll/unix/poll.lo
poll/unix/pollcb.lo poll/unix/pollset.lo poll/unix/port.lo poll/unix/select.lo
random/unix/apr_random.lo random/unix/sha2.lo random/unix/sha2_glue.lo shmem/unix/shm.lo
support/unix/waitio.lo threadproc/unix/proc.lo threadproc/unix/procsup.lo
threadproc/unix/signals.lo threadproc/unix/thread.lo threadproc/unix/threadpriv.lo
time/unix/time.lo time/unix/timestr.lo user/unix/groupinfo.lo user/unix/userinfo.lo
-luuid -lrt -lcrypt  -lpthread

/usr/bin/ld: cannot find -load
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [libapr-1.la] Error 1
make[3]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib'
make: *** [all-recursive] Error 1

最佳答案

我找到了一个解决方案,尽管我不能 100% 确定根本原因。

看来apache的配置文件在链接时会将编译器标志和链接器标志放在一起。那么我们能做的就是在configure中找到所有与链接相关的语句。例如我们在根目录下使用如下命令:

grep -r '\--mode=link' .

然后我们转到每个配置文件并删除 $(COMPILE)

您可能还会遇到标签问题,可以通过以下方式解决: https://forums.gentoo.org/viewtopic-t-915572-start-0.html

此外,由于我们要链接动态库,因此需要在运行 make 之前导出正确的 LD_LIBRARY_PATH。

关于apache - 使用 LLVM Plus 自定义 channel 和自定义库编译 Apache Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21840668/

相关文章:

Apache .htaccess 白名单不会使用 Mod_jk 阻止 Tomcat

c++ - 我可以完全停止使用 "inline"吗?

c++ - 为什么对象的大小为零

c++ - 异步事件 : already defined linker error [Windows Update API]

apache - 如何将 SSL_RSA 添加到 SSLCipherSuite?

apache - 使用 mod_rewrite 匹配奇数或偶数

c++ - 在 Debian/squeeze 上查找 libstdc++ 中丢失的符号

c++ - 未创建目标文件

c - Apache2.4如何加载一个完整的库

java - MinGW shell 未找到 MinGW gcj 编译器