我需要使用 gcc 为 RHEL4 构建一个 wget 不完整的可执行文件,它将使用特定的 OpenSSL 共享库。LD_LIBRARY_PATH 在构建时未设置。
通过指定以下内容非常简单:
LDFLAGS="-W1,-rpath=/usr/local/ssl/lib -L/my_build_dir/usr/local/ssl/lib"
一切都很好。
但这使得 RPATH 在我不完整的可执行文件的动态部分中:
Library rpath: [/usr/local/ssl/lib:/my_build_dir/usr/local/ssl/lib]
是否可以使用 gcc 工具链将 RPATH 设置为仅使用使用 -rpath 选项指定的内容并忽略构建时声明的所有库路径?
我今天看了很多 SO 帖子,包括:
我不明白 -Wl,-rpath -Wl , 和 -rpath 和 -L 有什么区别?
但似乎没有什么可以解决从最终不完整的可执行文件中删除构建信息的问题。
编辑:这是最终链接阶段的完整命令行。
gcc -Wall -std=c99 -m32 -march=athlon -mfpmath=sse -msse2 -O2 -pipe -s \
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -m32 -march=athlon \
-mfpmath=sse -msse2 -O2 -pipe -s -Wl,-rpath,/usr/local/ssl/lib \
-L/my_build_dir/usr/local/ssl/lib -o wget cmpt.o connect.o convert.o \
cookies.o ftp.o css_.o css-url.o ftp-basic.o ftp-ls.o hash.o host.o \
html-parse.o html-url.o http.o init.o log.o main.o netrc.o progress.o \
ptimer.o recur.o res.o retr.o spider.o url.o warc.o utils.o exits.o
build_info.o iri.o version.o ftp-opie.o openssl.o http-ntlm.o \
../lib/libgnu.a /my_build_dir/usr/local/ssl/lib/libssl.so \
/my_build_dir/usr/local/ssl/lib/libcrypto.so -Wl,-rpath \
-Wl,/my_build_dir/usr/local/ssl/lib -ldl -lz -lidn -luuid -lrt
感谢下面 nos 和 keltar 的评论,我可以看到问题出在哪里。
现在要弄清楚为什么 configure 完成了用它们的完整路径指定两个 openssl 库。
编辑 2:只是为了确认 -rpath 和 -L 选项工作正常。
如果我重写上述命令以删除对 openssl 库的构建位置的硬引用,则不完整的可执行文件中的 RPATH 将设置为 /usr/local/ssl/lib。
完整编辑的命令是:
gcc -Wall -std=c99 -m32 -march=athlon -mfpmath=sse -msse2 -O2 -pipe -s \
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -m32 -march=athlon \
-mfpmath=sse -msse2 -O2 -pipe -s -Wl,-rpath,/usr/local/ssl/lib \
-L/my_build_dir/usr/local/ssl/lib -o wget cmpt.o connect.o convert.o \
cookies.o ftp.o css_.o css-url.o ftp-basic.o ftp-ls.o hash.o host.o \
html-parse.o html-url.o http.o init.o log.o main.o netrc.o progress.o \
ptimer.o recur.o res.o retr.o spider.o url.o warc.o utils.o exits.o \
build_info.o iri.o version.o ftp-opie.o openssl.o http-ntlm.o \
../lib/libgnu.a -lssl -lcrypto -ldl -lz -lidn -luuid -lrt