【问题标题】:How to change the entry point of gcc generated asm code?如何更改 gcc 生成的 asm 代码的入口点?
【发布时间】:2014-01-11 07:07:36
【问题描述】:

本实验是在 32 位 Linux 上进行的。

我想在 asm 级别上进行转换,我正在尝试实现 我在调用函数 ma​​in 之前的转换。

目前我正在尝试编写一个新的入口点,实现我的转换代码, 并希望这个新的入口点能够成功调用ma​​in

gcc生成的汇编代码的默认入口点基本上是main,我举个例子如下:

c 代码:

int main()
{
    return 0;
}

我用这个命令生成asm代码:

gcc -masm=intel -fno-asynchronous-unwind-tables -S main.c

这就是我得到的:

    .file   "main.c"
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
    push    ebp
    mov     ebp, esp
    mov     eax, 0
    pop     ebp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section        .note.GNU-stack,"",@progbits

谁能告诉我如何实现一个新入口点(可能是一个类似于_start的函数)并在这个新入口点的末尾调用ma​​in? p>

谢谢!

【问题讨论】:

  • 如何调用你的新入口点?否则考虑重写crt*.o 启动。学习GCC 4.8.2源码!
  • 链接代码时,可以使用-e 开关来决定入口点... 例如:ld -o output_file_name obj_file.o -lc -dynamic-linker /lib/ld-linux-so.2 -e _start
  • @SAM 嗨,ASM,我对代码进行了修改,但它只是在启动函数结束时崩溃了...我不知道发生了什么...
  • @SAM 我发布了我的问题here,你能帮帮我吗?谢谢!

标签: linux gcc assembly nasm gnu-assembler


【解决方案1】:

我怀疑您是否应该替换 _start(),因为它非常特定于平台和 libc。要么您在汇编程序中编写所有代码,因此您不需要特定于 libc 的初始化,或者您应该复制所有 _start() 活动,包括您不知道的事情。后者看起来简直是假的。

如果您同意不替换 start() 而是使用一种机制在 main() 之前运行一些代码,请使用 __attribute__((constructor)) 声明一个函数。这是记录在案的 GCC 扩展,它被积极使用,例如用于 C++ 中的静态对象初始化。此类函数不能获取参数或返回实际值,也不能以其他方式覆盖控制流。我无法理解您对“转型”的含义,因此它可能与您的意图相矛盾;如果是这样,您会更详细地解释这一点。

【讨论】:

  • 感谢您的回答,现在我知道实现类似 __start() 的函数不是一个好主意。但我认为应该在 c/ 中添加 __attribute__((constructor)) c++代码级别,不在汇编级别..
  • @computereasy 在 GCC 中,在 c/c++ 代码级别上指定的所有功能都生成汇编程序输出,后者被编译成目标代码。这是主要的 GCC 模式,所以在哪里实现这个属性并不重要,它无论如何都会起作用。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多