3

我正在使用 Linux 2.6.35 的 ARM 系统上运行 prelink。我正在使用 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

我在飞思卡尔的 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。

4

1 回答 1

2

Layout error: section size too small for data在以下行https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230在 libelf 中调用了该错误。

这被write_dso中的 prelink 调用

if (elf_update (dso->elf, ELF_C_WRITE) == -1)
  return 2;

write_dso在 prelink的main.c以及其他一些地方update_dso调用。

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

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

你的 prelink.cache 是什么?

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

文件实用程序会告诉你。

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

gcc -V会告诉你。随着ld -Vprelink -V

你的是什么LD_LIBRARY_PATH

setor命令会env告诉你。

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

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

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

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

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

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

于 2012-03-31T21:28:46.167 回答