如何在交叉编译期间强制链接到未安装的库

How to force linkage to non installed libraries during cross compilation

本文关键字:链接 安装 交叉编译      更新时间:2023-10-16

我与g++的情况如下。我构建了一个名为 libplugin.so 的共享库,它由应用程序在运行时加载。此libplugin.so链接到其他一些共享库(使用 -no-as-needed 链接器选项)和静态库。

由于libplugin.so本身不使用列出的库中的任何符号,因此当插件在运行时加载时,需要-no-as-needed使动态加载器加载所有必需的库 - 这些库实际上仅由静态库引用。在我的x86构建机器上,所有列为-no-as-needed的库都安装在系统中。所以,那里的库建得很好,程序也可以。

现在我正在尝试为 ARM 交叉编译,但存在一些问题,因为链接器在构建libplugin.so时找不到系统中指示为-no-as-needed的库。链接找不到库,因为它们(故意)未安装。我宁愿不安装它们。

所以这是我的问题。由于libplugin.so不以任何方式直接引用传递给-no-as-needed的库,因此有没有办法"强制"链接器构建libplugin.so尽管传递给-no-as-needed的 ARM 库在我的 x86 构建系统中不存在?

下面是一个示例:

arm-linux-gnueabihf-g++ -o libplugin.so module1.o module2.o -L./libstatic.a -Wl,--no-as-needed -lX11 -lXext -shared -s -fPIC
arm-linux-gnueabihf-ld: cannot find -lX11

Afaik 你不能轻易做到这一点。但是,由于您的库不使用要链接到的共享库中的任何内容,因此您应该能够通过创建一个虚拟的libX11库并链接到该库来欺骗链接器:

arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null

这将创建一个可以链接到的相当空的 libX11.so。重要的部分是这个库的别名,它必须与真实库的别名相匹配 - 你可以用例如

readelf -a /lib/libX11.so |grep soname