自定义放置在链接器脚本中的函数

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    

或者如果可能的话,我希望在自定义命名的部分中使用这些函数,例如 customSection1customSection2

我得到了什么

我从 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    

其他信息

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