gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:50:39 25 4
gpt4 key购买 nike

我在基于 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

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

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

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

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

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

最佳答案

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

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

(恭喜您的客户非常精明。)

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

关于c - 共享对象文件中标记为 RWE 的程序头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com