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