【问题标题】:Prelink error: Layout error: section size too small for data预链接错误:布局错误:节大小对于数据来说太小
【发布时间】:2012-04-11 15:00:58
【问题描述】:

我正在使用 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.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

尝试将预链接运行为: 预链接 -a 预链接-amR

两种方式都得到了相同的结果。

我正在运行 gcc 4.4.6 交叉编译器。 我正在运行 ld 1.12.1 ld。

【问题讨论】:

  • 虽然从源代码构建软件是这里的主题,但您更有可能在Stack Overflow 上找到专家,尤其是在您构建自己的程序时。所以我将这个问题标记为迁移(请勿转发)。
  • 好的,没问题。由于这个问题实际上并不涉及编写任何代码,因此我认为 SO mods 会希望将其重新定位到这里。我想我在那里有更好的机会,但我想按规则比赛。感谢您的帮助。

标签: linux arm dynamic-linking elf prelink


【解决方案1】:

libelf 中的错误 Layout error: section size too small for data 在以下行 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_dsoupdate_dso 调用,它在预链接的main.c 以及其他一些地方调用。

发生这种情况是因为要重定位的节数据的大小大于要重定位到的节大小。

您正在运行什么预链接命令?

你的 prelink.cache 是什么?

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

文件实用程序会告诉你。

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

gcc -V 会告诉你。还有ld -Vprelink -V

你的LD_LIBRARY_PATH 是什么?

setenv 命令会告诉你。

glibc 编译时使用了哪些选项?特别是关于 -fPIC ?

您是否在设备本身上运行预链接?还是在交叉编译环境中?

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

您是否使用 -m 开关运行 prelink 以转换虚拟内存? 如果您将 /lib 中的所有内容列入黑名单,那么我相信您无法预链接任何链接到 /lib 中的库的库或二进制文件,同样,如果您将 /lib/libc-2.12.2.so 列入黑名单,那么您将无法预链接到任何链接到它的东西,因为预链接文件也需要预链接它的库。

至于可能的修复,没有更多信息,很难说,但它可能与传递给预链接的错误开关或在预链接缓存或配置文件的同一目录中混合 32 位或 64 位库有关。

提供有关链接和预链接的更多信息

【讨论】:

  • 谢谢。几天后我回到开发机器我可以回答这个问题。
  • 我已经用您要求的大部分信息更新了我的问题。我没有为这个平台构建 glibc。它出现在我刻录到闪存的​​根文件系统上。如何确定编译时使用的 -fPIC 选项?
  • 很抱歉,系统没有通知编辑,所以我没有注意到您已更新。稍后我会对此进行调查并回复您。
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多