gpt4 book ai didi

c - 如何控制ELF文件中节到段的映射?

转载 作者:行者123 更新时间:2023-12-03 02:09:02 24 4
gpt4 key购买 nike

所以我知道我们可以向 ELF 文件添加自定义部分,并强制将函数和结构映射到自定义部分。这可以通过__atribute__section("sectionname")来完成这是我当前 ELF 的 readelf 输出,其中包含一个名为 ver_info

的结构的自定义节名称 .my_custom_section

结构:

typedef struct version_info
{
int dd ;
int mm;
int yy;
int hr;
int min;
char *software_type;
char *software_version;
char *hex_tools_version;
} version_info;

version_info ver_info __attribute__ ((section(".my_custom_section"))) = {7, 10, 2013, 17, 17, "some_type", "some_sw_version", "some_version"} ;

这是 Sprite 的阅读方式:

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .hash HASH 000000d4 0000d4 00003c 04 A 2 0 4
[ 2] .dynsym DYNSYM 00000110 000110 0000a0 10 A 3 5 4
[ 3] .dynstr STRTAB 000001b0 0001b0 000026 00 A 0 0 1
[ 4] .rela.dyn RELA 000001d8 0001d8 000024 0c A 2 0 4
[ 5] .plt PROGBITS 00001000 001000 000000 00 AX 0 0 16
[ 6] .text PROGBITS 00001000 001000 00001c 00 AX 0 0 4
[ 7] .rodata PROGBITS 00002000 002000 000027 00 A 0 0 1
[ 8] .dynamic DYNAMIC 00004000 003000 000078 08 WA 3 0 4
[ 9] .got PROGBITS 00004078 003078 000000 00 WA 0 0 4
[10] .got.plt PROGBITS 00004078 003078 000010 04 WA 0 0 8
[11] .my_custom_sectio PROGBITS 00004088 003088 000020 00 WA 0 0 4
[12] .bss NOBITS 000040c0 0030a8 000000 00 WA 0 0 1
[13] .comment PROGBITS 00000000 0030a8 000028 01 MS 0 0 1
[14] .shstrtab STRTAB 00000000 0030d0 000081 00 0 0 1
[15] .symtab SYMTAB 00000000 0033fc 000180 10 16 19 4
[16] .strtab STRTAB 00000000 00357c 000075 00 0 0 1

Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x00000000 0x00000000 0x001fc 0x001fc R 0x1000
LOAD 0x001000 0x00001000 0x00001000 0x0001c 0x0001c R E 0x1000
LOAD 0x002000 0x00002000 0x00002000 0x00027 0x00027 R 0x1000
LOAD 0x003000 0x00004000 0x00004000 0x000a8 0x000c0 RW 0x1000
DYNAMIC 0x003000 0x00004000 0x00004000 0x00078 0x00078 RW 0x4

Section to Segment mapping:
Segment Sections...
00 .hash .dynsym .dynstr .rela.dyn
01 .text
02 .rodata
03 .dynamic .got.plt .my_custom_section
04 .dynamic

在这种情况下,我的自定义部分与 .dynamic.got.plt 部分结合在一起并映射到段 03。我想将此部分映射为独立的部分分段自身。

我们可以控制将节映射到段吗?你会怎样做呢?

编辑:
1.为什么这个结构符号不使用dlsym:我不太热衷于将此结构添加为动态符号的原因是我正在编写一个API来读取版本信息(我计划将其包含在一个单独的段中),这将最终决定我是否应该dlopen这个SO文件。这是避免打开过时 SO 的安全措施的一部分。

2.使用自定义链接描述文件:我现在使用添加以下部分的自定义链接描述文件:

.my_custom_section() :
{
KEEP (*version_info.o (.rodata* ))
}

这确实让我可以创建所需名称的部分并将我的数据放入其中。但我仍在努力避免此部分与 .rodata 或其他一些部分混在一起。

我确信,通过在链接器脚本中指定一些配置,我可以将此部分映射为独立的段,但这正是我想要弄清楚的。

最佳答案

这是您必须向链接器提供的指令。具体如何执行此操作取决于您使用的链接器。

对于 GNU ld,“正确”的方法是使用自定义链接描述文件,您可以使用 -T 选项提供该脚本。您可以通过输入 ld --verbose 来查看默认链接描述文件。对于其他链接器来说也是类似的情况:BSD 链接器(由 Mac OSX 使用)使用顺序文件(用 -order_file 指定),Solaris 链接器使用映射文件(用 指定) -M),等等。他们都做几乎相同的事情。

请注意,每个平台和每个 CPU 系列通常都有自己的链接规范,因此适用于 x86_64 目标的 GNU ld 链接器脚本可能不适用于 ARM,即使它们都是 Linux。 BSD 系列的情况也类似。一般来说,您应该获取平台的链接描述文件并根据需要对其进行修改。如果这是针对自定义平台的(例如,它是固件,您正在编写自己的操作系统,或者您有什么),您可能应该只从头开始编写自己的链接器脚本。

如果这是需要跨平台的代码,那么没有好的解决方案。有一些“错误”的方法可以做到这一点,例如使用 objcopy 进行黑客攻击,但我不推荐它们。

话虽如此,您可能应该问问自己这是否真的是您想要的。如果您需要的是某些自定义工具或框架(例如动态链接加载器)可以轻松找到的数据,您不能使用 dlsym 或等效工具吗?

编辑:7 年过去了,我刚刚注意到有更多信息。我希望这还不算太晚!

GNU ld 还有两个 commands in its linker scripts您可能不知道:PHDRS 和 SECTIONS。我从未使用过它们,但它们可以满足您的需求。

关于c - 如何控制ELF文件中节到段的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259458/

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