c语言 - 在共享对象文件中标记为 RWE 的程序头



我正在使用基于 Intel 的 64 位 Linux 系统上的交叉编译器来构建我们的一些软件,以便它可以在 32 位 PowerPC 芯片上运行。 交叉编译器由Crosstools制作。

当我对交叉编译器生成的共享对象文件(.so 文件)运行"readelf -a"时,部分输出显示如下:

Program Headers:
Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
LOAD           0x000000 0x00000000 0x00000000 0x9a87c 0x9a87c R E 0x10000
LOAD           0x09a87c 0x000aa87c 0x000aa87c 0x01344 0x03230 RWE 0x10000
DYNAMIC        0x09ba84 0x000aba84 0x000aba84 0x000d0 0x000d0 RW  0x4
GNU_EH_FRAME   0x09a7bc 0x0009a7bc 0x0009a7bc 0x0002c 0x0002c R   0x4
GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

问题是标题标记为 RWE。 评估我们软件的潜在客户对此有疑问,并希望它只是RW。

第二个交叉编译器由相同版本的Crosstools生成,面向相同版本的gcc,为64位PowerPC芯片生成代码。 此交叉编译器生成的共享对象文件不会生成任何 RWE 标头(第二个 LOAD 标头仅标记为 RW)。

在这两种情况下,编译和链接的 gcc 限定符是相同的。

我对交叉编译器和 ELF 标头的世界有点陌生。 有没有办法让 32 位交叉编译器创建没有标记为 RWE 的标头的共享对象文件?

如果做不到这一点,有没有办法(安全地)修补已经创建的 .so 文件以更改标记为 RWE 的标头,使其标记为 RW?

你能检查部分到程序标题的映射(eu-readelf -l)吗? 我很确定会发生这种情况,因为您的目标配置默认不启用前段时间为 GNU/Linux 实现的安全 GOT 功能:

  • PowerPC New PLT 和 GOT

请参阅ld中的--bss-plt--secure-plt和 PowerPC 32 位 ELF 支持,了解用于控制此行为的标志。 如果使用自定义程序加载程序,则可能需要对其进行调整以获得安全的PLT支持。 glibc 动态链接器支持它。

(恭喜你的客户非常精明。

编辑如果--secure-plt不起作用,则您的 PowerPC 子目标与其不兼容,或者您错误地构建了工具链,或者存在覆盖其效果的链接器脚本。

相关内容

  • 没有找到相关文章

最新更新