嵌入共享库的绝对路径

使用供应商提供的交叉编译工具链(显然是OpenEmbedded衍生产品),我无法将绝对路径嵌入到第三方(开源,内部编译)库中。 使用以下gcc命令行:

arm-linux-gcc test_connect_send.o gprs_connect.o \ /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgprs_stuff.so \ /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libpower_supply_stuff.so \ /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgsm_stuff.so \ /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libtcp_stuff.so \ /package/host/aspl.es/vortex-1.1.0/lib/libvortex-1.1.so \ /package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0 -o test_connect_send 

objdump说:

 Dynamic Section: NEEDED /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgprs_stuff.so NEEDED /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libpower_supply_stuff.so NEEDED /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgsm_stuff.so NEEDED /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libtcp_stuff.so NEEDED libvortex-1.1.so.0 NEEDED libaxl.so.0 NEEDED libgcc_s.so.1 NEEDED libc.so.6 

请注意我的供应商的库如何拥有完整的路径,而aspl则没有。 另外,请注意嵌入的名称与我在命令行中指定的名称不同。 我想知道为什么(谁在弄乱我的路径),以及如何解决它。

ps:我知道RPATH,这不是我正在寻找的答案

我的猜测是供应商提供的库将SONAME设置为完整的安装路径。

arm-linux-gcc -print-file-name没有显示任何令人惊讶的内容:

arm-linux-gcc -print-file-name = / package / host / aspl.es / axl-0.5.6 / lib / libaxl.so.0.0.0 /package/host/aspl.es/axl-0.5.6 /lib/libaxl.so.0.0.0 arm-linux-gcc -print-file-name = / package / host / aspl.es / axl-0.5.6 / lib / libaxl.so.0.0 / package / host / aspl .es / axl-0.5.6 / lib / libaxl.so.0.0 arm-linux-gcc -print-file-name = / package / host / aspl.es / axl-0.5.6 / lib / libaxl.so.0 /package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0 arm-linux-gcc -print-file-name = / package / host / aspl.es / axl-0.5.6 / lib /libaxl.so /package/host/aspl.es/axl-0.5.6/lib/libaxl.so

如果没有定义LD_LIBRARY_PATH,生成的二进制文件就不会运行,也没有DT_RPATH(虽然这可能肯定有帮助,建议?)

我不想依赖/etc/ld.so.conf正确设置,因此我想要到处都是绝对路径。

请注意,建议可能指向第三方库的编译,这些库目前已编译为:

制造干净的; LDFLAGS = -L / package / host / myvendor.com / arm9-linux-toolchain-2.1 / prefix / arm-linux / lib CC = / package / host / myvendor.com / arm9-linux-toolchain-2.1 / prefix / bin / arm-linux-gcc~ / wd / sources / contrib / axl / configure –prefix = / shared / syst / arm9-linux-abtrack / package / host / aspl.es / axl-0.5.6 –host = armv4tl -unknown-linux-gnu –disable-axl-knife –disable-axl-babel –disable-axl-log –disable-axl-test && make

制造干净的; AXL_LIBS =“ – L / shared / syst / arm9-linux-abtrack / package / host / aspl.es / axl-0.5.6 / lib / -laxl -lm”AXL_CFLAGS = -I / shared / syst / arm9-linux- abtrack / package / host / aspl.es / axl-0.5.6 / include / axl CC = / package / host / myvendor.com / arm9-linux-toolchain-2.1 / prefix / bin / arm-linux-gcc LDFLAGS =“ -L / package / host / myvendor.com / arm9-linux-toolchain-2.1 / prefix / arm-linux / lib“〜/ wd / sources / contrib / vortex / configure –prefix = / shared / syst / arm9-linux -abtrack / package / host / aspl.es / vortex-1.1.0 –disable-http-support –disable-pull-support –disable-tunnel-support –disable-xml-rpc-support-gen – disable-xml-rpc-support –disable-sasl-support –disable-vortex-log –disable-vortex-client –host = armv4tl-unknown-linux-gnu && make

在编译库中嵌入–prefix的任何autofoo技巧?

这是一个老问题,但我想我还是会添加一个可能的答案。

根据您提供的信息,可能是aspl不包含完整路径名,因为您指定的aspl库是软链接吗? 如果你做一个很长的列表,例如/package/host/aspl.es/vortex-1.1.0/lib/libvortex-1.1.so它会显示它是libvortex-1.1.so.0的链接(带有没有完整的路径名)。

因此,如果您仍希望嵌入完整路径,则需要使用实际库的完整路径,而不是链接库。