预链接错误:布局错误:数据的部分大小太小

3
我正在运行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

有没有办法让我修复这个问题或者说说服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
我使用的是Freescale的i.MX51平台,它是一个ARM Cortex-8。由于我使用了我们开发套件提供的GCC/G++版本进行编译,所以我假设ELF二进制文件是32位的。
编辑:
我将-h标志更改为-l,并将系统库移到了列表的前面。但我仍然得到相同的错误。
我在设备上运行prelink,而不是在交叉编译机器上运行。
LD_LIBRARY_PATH包含/lib和/usr/lib。
尝试以以下方式运行prelink: prelink -a prelink -amR
两种方法都得到了相同的结果。
我正在运行gcc 4.4.6交叉编译器。 我正在运行ld 1.12.1 ld。

2
虽然在这里从源代码构建软件是相关的,但是你更有可能在[so]上找到专家,尤其是当你正在构建自己的程序时。因此,我将此问题标记为迁移(请勿重新发布)。 - Gilles 'SO- stop being evil'
好的,没问题。由于这个问题实际上并不涉及编写任何代码,我想 SO 的管理员会希望将其转移到这里。我认为在那里我有更好的机会,但是想要遵守规则。感谢您的帮助。 - San Jacinto
1个回答

2
错误信息“Layout error: section size too small for data”在以下行中被称为libelf,具体是https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230。该错误由prelink中的write_dso调用。
if (elf_update (dso->elf, ELF_C_WRITE) == -1)
  return 2;

write_dsoupdate_dso调用,在prelink的main.c中以及其他几个地方也会被调用。

这是因为被重定位的段数据大小大于其被重定位到的段大小。

您运行的是哪个prelink命令?

您的prelink.cache是什么?

您的二进制文件/库是ELF32还是ELF64?

可以使用file实用程序进行查询。

gcc版本、binutil版本、libelf和prelink版本是什么?

gcc -V会告诉您。连同ld -Vprelink -V一起。

您的LD_LIBRARY_PATH是什么?

set或env命令会告诉您。

glibc编译时选择了哪些选项?特别是-fPIC选项?

您是在设备本身上运行prelink还是在交叉编译环境中运行?

为什么您的prelink配置没有-l行?-h行将跟随符号链接,这可能不是您想要的,如果您的构建根目录具有库目录中的符号链接?另外,通常在prelink.conf中首先输入/lib和/usr/lib条目,例如这里的示例。

是否使用-m开关运行prelink以转换虚拟内存? 如果您在/lib中列出了所有内容,则我认为您无法预链接链接到/lib中的任何库或二进制文件,同样地,如果您黑名单/lib/libc-2.12.2.so,则无法预链接到链接到它的任何内容,因为经过预链接的文件也需要预链接其库。

至于可能的修复措施,在没有更多信息的情况下很难说,但可能与传递给prelink的不正确开关或在prelink缓存或配置文件中混合32位或64位库有关。

有关链接和prelink的更多信息可用


谢谢。几天后我回到开发机器上,就可以回答这个问题了。 - San Jacinto
我已经更新了我的问题,并提供了你所要求的大部分信息。我没有为这个平台构建glibc。它是我烧录到闪存中的根文件系统自带的。我该如何确定它编译时使用的-fPIC选项? - San Jacinto
很抱歉,系统没有通知编辑,所以我没有注意到您已经更新了。我稍后会查看并回复您。 - San Jacinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接