如何在交叉编译期间强制链接到未安装的库
How to force linkage to non installed libraries during cross compilation
我和 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
的库,有没有办法 "force" 链接器构建 libplugin.so
尽管 ARM 库传递给 -no-as-needed
在我的 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 你不能轻易做到这一点。但是由于你的库没有使用你想要 link 的共享库中的任何东西,你应该能够通过创建一个虚拟 libX11 库和 link 来欺骗 linker :
arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null
这将创建一个相当空的 libX11.so,您可以 link。重要的部分是这个库的 soname,它必须与真实库的 soname 相匹配——你可以用
来计算
readelf -a /lib/libX11.so |grep soname
我和 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
的库,有没有办法 "force" 链接器构建 libplugin.so
尽管 ARM 库传递给 -no-as-needed
在我的 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 你不能轻易做到这一点。但是由于你的库没有使用你想要 link 的共享库中的任何东西,你应该能够通过创建一个虚拟 libX11 库和 link 来欺骗 linker :
arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null
这将创建一个相当空的 libX11.so,您可以 link。重要的部分是这个库的 soname,它必须与真实库的 soname 相匹配——你可以用
来计算readelf -a /lib/libX11.so |grep soname