我在装有 Linux 2.6.35 的 ARM 系统上运行预链接。我正在使用 Glibc 2.12.2。我想预链接我的库和应用程序可执行文件。但是,我似乎无法链接任何直接依赖于 glibc 的东西。当 prelink 尝试在 /lib
上运行时,它会出错:
Could not write /lib/libc-2.12.2.so: Layout error: section size too small for data
我有没有办法解决这个问题,或者说服预链接预链接除了 /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,并将系统库移至列表的前面。我仍然遇到同样的错误。
我在设备上运行 prelink,而不是在我的交叉构建机器上。
LD_LIBRARY_PATH 包含/lib 和/usr/lib
尝试将预链接运行为: 预链接-a 预链接-amR
两种方式都得到相同的结果。
我正在运行 gcc 4.4.6 交叉编译器。 我正在运行 ld 1.12.1 ld。
最佳答案
错误 Layout error: section size too small for data
在 libelf 中的以下行调用 https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230 .
这由 write_dso 中的预链接调用
if (elf_update (dso->elf, ELF_C_WRITE) == -1)
return 2;
write_dso
被 update_dso
调用,后者在 main.c 中被调用预链接以及其他一些地方。
发生这种情况是因为被重定位的部分数据的大小大于它被重定位到的部分大小。
您正在运行什么预链接命令?
你的 prelink.cache 是什么?
您的二进制文件/库是 ELF32 还是 ELF64?
文件实用程序会告诉您。
什么是 gcc 版本、binutil 版本、libelf 和 prelink 版本?
gcc -V
会告诉你。连同 ld -V
和 prelink -V
。
你的 LD_LIBRARY_PATH
是什么?
set
或 env
命令会告诉您。
glibc 编译时使用了哪些选项?特别是关于 -fPIC ?
您是否在设备本身上运行预链接?还是在交叉编译环境中?
为什么您的预链接配置没有 -l
行? -h
行将遵循符号链接(symbolic link),如果您的构建根在库目录中有符号链接(symbolic link),这可能不是您想要的?通常/lib 和/usr/lib 条目在 prelink.conf 中排在第一位,如示例 here .
您是否使用 -m 开关运行预链接以转换虚拟内存? 如果您将/lib 中的所有内容列入黑名单,那么我相信您不能预链接任何链接到/lib 中的库的库或二进制文件,同样,如果您将/lib/libc-2.12.2.so 列入黑名单,那么您不能预链接到任何链接到它的东西,因为预链接文件也需要其库被预链接。
至于可能的修复,在没有更多信息的情况下很难说,但这可能与传递给预链接的开关不正确或在预链接缓存或配置文件的同一目录中混合 32 位或 64 位库有关。
有关链接和预链接的更多信息可用
关于linux - 预链接错误 : Layout error: section size too small for data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900402/