我正在使用Linux 2.6.35在ARM系统上运行prelink。我正在使用Glibc 2.12.2。我想预先链接我的库和应用程序可执行文件。但是,我似乎无法链接任何直接依赖于glibc的东西。当预链接尝试在/lib
上运行时,它会出错:
Could not write /lib/libc-2.12.2.so: Layout error: section size too small for data
我有没有办法解决这个问题,或者说服prelink来预先链接除了/lib
之外的所有内容?我知道/etc/prelink.conf
中的黑名单功能,但是prelink会出错,因为它找不到位于该目录中的依赖项。
编辑:
这是我的prelink.conf
~ # cat /etc/prelink.conf -h /usr/local/Qt-4.7.4/lib -h /usr/lib -h /lib -h /usr/local/dbus/lib -h /usr/local/sqlite/lib -h /usr/local/ncurses/lib -h /usr/local/expat/lib -h /usr/local/ssl/lib
我在飞思卡尔的i.MX51平台上。它是ARM Cortex-8。由于我已经使用我们的开发工具包附带的GCC / G ++版本编译了所有内容,因此我假设ELF二进制文件是32位。
编辑:
我将-h标志更改为-l,并将系统库移动到列表的前面。我仍然得到同样的错误。
我在设备上运行预链接,而不是在我的交叉构建机器上运行。
LD_LIBRARY_PATH包含/ lib和/ usr / lib
尝试运行prelink为: prelink -a prelink -amR
并且两种方式都得到了相同的结果。
我正在运行gcc 4.4.6交叉编译器。 我正在运行ld 1.12.1 ld。
答案 0 :(得分:2)
在以下行https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230的libelf中调用错误Layout error: section size too small for data
。
这可以通过write_dso
中的预链接来调用if (elf_update (dso->elf, ELF_C_WRITE) == -1)
return 2;
<{> write_dso
被update_dso
调用,它会在main.c预链接中与其他一些地方一起调用。
这是因为重定位的节数据的大小大于重定位的节大小。
您正在运行什么prelink命令?
你的prelink.cache是什么?
您的二进制文件/库是ELF32还是ELF64?
文件工具会告诉你。
什么是gcc版本,binutil版本,libelf和prelink版本?
gcc -V
会告诉你。以及ld -V
和prelink -V
。
你的LD_LIBRARY_PATH
是什么?
set
或env
命令会告诉您。
glibc编译的选项有哪些?特别是关于-fPIC?
您是否在设备上运行预链接?或者在交叉编译环境中?
为什么您的预链接配置没有-l
行? -h
行将遵循符号链接,如果您的构建根目录在库目录中有符号链接,那么这些符号链接可能不是您想要的?通常,/ lib和/ usr / lib条目首先出现在prelink.conf中,如示例here。
您是否正在使用-m开关运行prelink以交换虚拟内存? 如果你将/ lib中的所有内容列入黑名单,那么我相信你不能预先链接链接到/ lib库的任何库或二进制文件,类似的如果你将/lib/libc-2.12.2.so列入黑名单那么你就不能预先链接到任何链接到它的东西,因为预链接的文件也需要预先链接它的库。
对于可能的修复,没有更多信息,很难说,但它可能与传递给prelink或在预链接缓存或配置文件中的同一目录中混合32位或64位库的错误开关有关。
有关链接和预链接的更多信息是可用的