gpt4 book ai didi

gcc - 如何正确使用简单的链接描述文件?可执行文件在运行时获取SIGKILL

转载 作者:行者123 更新时间:2023-12-03 12:45:40 25 4
gpt4 key购买 nike

我试图了解更深的链接过程和链接描述文件...通过查看binutils doc,我发现了一个简单的链接描述文件实现,并通过添加一些命令对其进行了改进:

OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)

ENTRY(mymain)

SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}


我的程序是一个非常简单的程序:

void mymain(void)
{
int a;
a++;
}


现在,我尝试构建一个可执行文件:

gcc -c main.c
ld -o prog -T my_script.lds main.o


但是,如果我尝试运行 prog,它将在启动过程中收到 SIGKILL。我知道当程序被编译并与命令链接时:

gcc prog.c -o prog


最后的可执行文件也是 crt1.ocrti.ocrtn.o等其他目标文件的产物,但是我的情况呢?哪种正确的方式使用此链接描述文件?

最佳答案

我怀疑您的代码运行得很好,并最终陷入麻烦:您希望在a++之后发生什么?

mymain()只是一个普通的C函数,它将尝试返回其调用者。

但是,您已将其设置为ELF入口点,它告诉ELF加载器在将程序段加载到正确的位置后立即跳转至该点-并且它不希望您返回。

那些“其他目标文件,例如crt1.ocrti.ocrtn.o”通常为C程序处理。 C程序的ELF入口点不是main(),而是一个包装程序,它为main()设置了适当的环境(例如,在堆栈或寄存器中设置argcargv参数,取决于平台),调用main()(期望它可能返回),然后调用exit系统调用(使用main()的返回代码)。



[更新以下评论:]

当我尝试使用gdb的示例时,我发现它确实无法从mymain()返回:在mymain上设置断点,然后逐步执行说明后,我看到它执行增量,然后进入功能尾声中的麻烦:

$ gcc -g -c main.c
$ ld -o prog -T my_script.lds main.o
$ gdb ./prog
...
(gdb) b mymain
Breakpoint 1 at 0x10006: file main.c, line 4.
(gdb) r
Starting program: /tmp/prog

Breakpoint 1, mymain () at main.c:4
4 a++;
(gdb) display/i $pc
1: x/i $pc
0x10006 <mymain+6>: addl $0x1,-0x4(%ebp)
(gdb) si
5 }
1: x/i $pc
0x1000a <mymain+10>: leave
(gdb) si
Cannot access memory at address 0x4
(gdb) si
0x00000001 in ?? ()
1: x/i $pc
Disabling display 1 to avoid infinite recursion.
0x1: Cannot access memory at address 0x1
(gdb) q




至少对于i386,ELF加载器在输入所加载的代码之前先建立了一个合理的堆栈,因此您可以将ELF入口点设置为C函数并获得合理的行为。但是,如上所述,您必须自己处理干净的过程。而且,如果您不使用C运行时,最好也不要使用任何依赖C运行时的库。

因此,这是一个示例,使用您的原始链接程序脚本-修改了C代码以将 a初始化为一个已知值,并使用最终值 exit系统调用(使用内联汇编) >作为退出代码。 (注意:我刚刚意识到您还没有确切说明您使用的平台;我在这里假设使用Linux。)

$ cat main2.c
void mymain(void)
{
int a = 42;
a++;
asm volatile("mov $1,%%eax; mov %0,%%ebx; int $0x80" : : "r"(a) : "%eax" );
}
$ gcc -c main2.c
$ ld -o prog2 -T my_script.lds main2.o
$ ./prog2 ; echo $?
43
$

关于gcc - 如何正确使用简单的链接描述文件?可执行文件在运行时获取SIGKILL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182409/

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