首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确使用简单的链接器脚本?可执行文件在运行时获取SIGKILL

如何正确使用简单的链接器脚本?可执行文件在运行时获取SIGKILL
EN

Stack Overflow用户
提问于 2018-04-08 06:13:07
回答 1查看 0关注 0票数 0

我试图理解更深层次的链接过程和链接脚本......看着binutils doc,我发现了一个简单的链接脚本实现,我通过添加一些命令来改进:

代码语言:javascript
运行
复制
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
          "elf32-i386")
OUTPUT_ARCH(i386)

ENTRY(mymain)

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

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

代码语言:javascript
运行
复制
void mymain(void)
{
  int a;
  a++;
}

现在我试图建立一个可执行文件:

代码语言:javascript
运行
复制
gcc -c main.c
ld -o prog -T my_script.lds main.o

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

代码语言:javascript
运行
复制
gcc prog.c -o prog

最终的可执行文件是该产品也像其他的目标文件crt1.ocrti.ocrtn.o但对于我的情况?哪个是使用这个链接器脚本的正确方法?

EN

回答 1

Stack Overflow用户

发布于 2018-04-08 15:54:58

当我尝试你的例子时gdb,我发现它确实无法通过以下方式返回mymain():在设置了一个断点之后mymain,然后逐步执行指令,我发现它执行了增量,然后在函数结尾中遇到了麻烦:

代码语言:javascript
运行
复制
$ 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系统调用(使用内联汇编),并将最终值a作为退出代码。(注意:我刚刚意识到你还没有确切地说过你在使用什么平台,我在这里假设Linux。)

代码语言:javascript
运行
复制
$ 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
$ 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档