Ran*_*lue 44 linker ld linker-scripts
该LD手册并不能说明什么KEEP命令一样.以下是来自第三方链接器脚本的功能片段KEEP.什么是KEEP命令做ld?
SECTIONS
{
.text :
{
. = ALIGN(4);
_text = .;
PROVIDE(stext = .);
KEEP(*(.isr_vector))
KEEP(*(.init))
*(.text .text.*)
*(.rodata .rodata.*)
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.gcc_except_table)
*(.gnu.linkonce.r.*)
. = ALIGN(4);
_etext = .;
_sidata = _etext;
PROVIDE(etext = .);
_fini = . ;
*(.fini)
} >flash
Run Code Online (Sandbox Code Playgroud)
Mar*_*ort 44
即使没有引用符号,Afaik LD也会在符号中保留符号.(--gc截面).
通常用于在二进制启动过程中具有某些特殊含义的部分,或多或少地标记依赖关系树的根.
(对于下面的Sabuncu)
依赖树:
如果消除了未使用的代码,则需要分析代码并标记所有可访问的部分(代码+全局变量+常量).
因此,您选择一个部分,将其标记为"已使用"并查看它引用的其他部分,然后将这些部分标记为"已使用",并检查它们引用的内容等.
未标记为"已使用"的部分则是多余的,可以省略.
由于一个部分可以引用多个其他部分(例如,一个程序调用三个不同的其他部分),如果你要绘制结果,你会得到一棵树.
根源:
然而,上述原则给我们留下了一个问题:什么是总是使用的"第一"部分?树的第一个节点(根)可以这么说吗?这就是"keep()"的作用,它告诉链接器哪些部分(如果可用)是第一个要查看的部分.因此,这些总是相互关联的.
通常,这些是从程序加载器调用以执行与动态链接相关的任务(可以是可选的,并且依赖于OS/fileformat)以及程序的入口点的部分.
Cir*_*四事件 11
最小的Linux IA-32示例说明了它的用法
主要的:
.section .text
.global _start
_start:
/* Dummy access so that after will be referenced and kept. */
mov after, %eax
/*mov keep, %eax*/
/* Exit system call. */
mov $1, %eax
/* Take the exit status 4 bytes after before. */
mov $4, %ebx
mov before(%ebx), %ebx
int $0x80
.section .before
before: .long 0
/* TODO why is the `"a"` required? */
.section .keep, "a"
keep: .long 1
.section .after
after: .long 2
Run Code Online (Sandbox Code Playgroud)
link.ld:
ENTRY(_start)
SECTIONS
{
. = 0x400000;
.text :
{
*(.text)
*(.before)
KEEP(*(.keep));
*(.keep)
*(.after)
}
}
Run Code Online (Sandbox Code Playgroud)
编译并运行:
as --32 -o main.o main.S
ld --gc-sections -m elf_i386 -o main.out -T link.ld main.o
./main.out
echo $?
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud)
如果我们注释掉该KEEP行,则输出为:
2
Run Code Online (Sandbox Code Playgroud)
如果我们要么:
mov keep, %eax--gc-sections输出回到1.
在Ubuntu 14.04上测试,Binutils 2.25.
说明:
没有引用符号keep,因此它包含部分.keep.
因此,如果启用了垃圾收集并且我们不使用KEEP异常,那么该部分将不会放入可执行文件中.
由于我们将地址加4 before,如果该keep部分不存在,则退出状态将出现2在下.after一部分中.
TODO:如果我们删除"a"from .keep,这会使它可分配,没有任何反应.我不明白为什么会这样:该部分将被放入.text段中,因为它的魔术名称将是可分配的.
| 归档时间: |
|
| 查看次数: |
25637 次 |
| 最近记录: |