自定义放置在链接器脚本中的函数
Customize function placing in linker script
动机
我正在学习如何使用和编写我自己的链接描述文件。
问题
目前,我在 .c
文件中有 2 个简单函数,我想将这些函数中的每一个都放在单独的部分中,但我找不到如何“访问”这些函数链接描述文件。
复制步骤
这两个文件都在同一个目录中:
file1.c
int func1() {
return 10;
}
char * func3() {
return (void *) 0;
}
linker.ld
SECTIONS {
.text 0xDEADBEEF : {
file1.o (.text.func1)
}
.data 0x4 : {
file1.o (.text.func3)
}
}
现在执行以下操作:
gcc -c file1.c
ld -T linker.ld file1.o
Expected/Desired输出
我希望从 objdump -d a.out
得到什么:
a.out: file format elf64-x86-64
Disassembly of section .text:
00000000deadbeef <func1>:
deadbeef: 55 push %rbp
deadbef0: 48 89 e5 mov %rsp,%rbp
deadbef3: b8 0a 00 00 00 mov [=13=]xa,%eax
deadbef8: 5d pop %rbp
deadbef9: c3 ret
Disassembly of section .data:
0000000000000004 <func3>:
deadbefa: 55 push %rbp
deadbefb: 48 89 e5 mov %rsp,%rbp
deadbefe: b8 00 00 00 00 mov [=13=]x0,%eax
deadbf03: 5d pop %rbp
deadbf04: c3 ret
或者如果可能的话,我希望在自定义命名的部分中使用这些函数,例如 customSection1
和 customSection2
。
我得到了什么
我从 objdump -d a.out
那里得到以下信息:
a.out: file format elf64-x86-64
Disassembly of section .text:
00000000deadbeef <func1>:
deadbeef: 55 push %rbp
deadbef0: 48 89 e5 mov %rsp,%rbp
deadbef3: b8 0a 00 00 00 mov [=14=]xa,%eax
deadbef8: 5d pop %rbp
deadbef9: c3 ret
00000000deadbefa <func3>:
deadbefa: 55 push %rbp
deadbefb: 48 89 e5 mov %rsp,%rbp
deadbefe: b8 00 00 00 00 mov [=14=]x0,%eax
deadbf03: 5d pop %rbp
deadbf04: c3 ret
其他信息
- 我知道
<filename> (<here>)
括号中的名称应该是节,而不是函数名称。但是,我认为 <section>.<function>
可以工作,这是行不通的,如您所见
- 不知道把代码放到
.data
段是不是不常见。我刚刚读到 in the ld
manual a.out
仅支持部分名称,.text
、.bss
和 .data
:
In formats which only support a limited number of sections, such as a.out, the name must be one of the names supported by the format (a.out, for example, allows only .text, .data or .bss).
所以我选择了.data
。
为了指示编译器将每个函数放在一个单独的部分(如您所期望的那样命名 .text.<function_name>
或类似名称),您需要使用 -ffunction-sections
选项(对于 GCC)进行编译。
请参阅文档 here
动机
我正在学习如何使用和编写我自己的链接描述文件。
问题
目前,我在 .c
文件中有 2 个简单函数,我想将这些函数中的每一个都放在单独的部分中,但我找不到如何“访问”这些函数链接描述文件。
复制步骤
这两个文件都在同一个目录中:
file1.c
int func1() {
return 10;
}
char * func3() {
return (void *) 0;
}
linker.ld
SECTIONS {
.text 0xDEADBEEF : {
file1.o (.text.func1)
}
.data 0x4 : {
file1.o (.text.func3)
}
}
现在执行以下操作:
gcc -c file1.c
ld -T linker.ld file1.o
Expected/Desired输出
我希望从 objdump -d a.out
得到什么:
a.out: file format elf64-x86-64
Disassembly of section .text:
00000000deadbeef <func1>:
deadbeef: 55 push %rbp
deadbef0: 48 89 e5 mov %rsp,%rbp
deadbef3: b8 0a 00 00 00 mov [=13=]xa,%eax
deadbef8: 5d pop %rbp
deadbef9: c3 ret
Disassembly of section .data:
0000000000000004 <func3>:
deadbefa: 55 push %rbp
deadbefb: 48 89 e5 mov %rsp,%rbp
deadbefe: b8 00 00 00 00 mov [=13=]x0,%eax
deadbf03: 5d pop %rbp
deadbf04: c3 ret
或者如果可能的话,我希望在自定义命名的部分中使用这些函数,例如 customSection1
和 customSection2
。
我得到了什么
我从 objdump -d a.out
那里得到以下信息:
a.out: file format elf64-x86-64
Disassembly of section .text:
00000000deadbeef <func1>:
deadbeef: 55 push %rbp
deadbef0: 48 89 e5 mov %rsp,%rbp
deadbef3: b8 0a 00 00 00 mov [=14=]xa,%eax
deadbef8: 5d pop %rbp
deadbef9: c3 ret
00000000deadbefa <func3>:
deadbefa: 55 push %rbp
deadbefb: 48 89 e5 mov %rsp,%rbp
deadbefe: b8 00 00 00 00 mov [=14=]x0,%eax
deadbf03: 5d pop %rbp
deadbf04: c3 ret
其他信息
- 我知道
<filename> (<here>)
括号中的名称应该是节,而不是函数名称。但是,我认为<section>.<function>
可以工作,这是行不通的,如您所见 - 不知道把代码放到
.data
段是不是不常见。我刚刚读到 in theld
manuala.out
仅支持部分名称,.text
、.bss
和.data
:
In formats which only support a limited number of sections, such as a.out, the name must be one of the names supported by the format (a.out, for example, allows only .text, .data or .bss).
所以我选择了.data
。
为了指示编译器将每个函数放在一个单独的部分(如您所期望的那样命名 .text.<function_name>
或类似名称),您需要使用 -ffunction-sections
选项(对于 GCC)进行编译。
请参阅文档 here