如何更改gcc生成的asm代码的入口点?

时间:2013-12-23 04:55:31

标签: linux gcc assembly nasm gas

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

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

目前我正在尝试编写一个新的入口点,实现我的转换代码, 并希望这个新的切入点可以成功调用 main

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

c code:

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的功能)并在此新入口点的末尾调用 main 吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我怀疑你应该替换_start(),因为它是特定于平台和libc的。您可以在汇编程序中编写所有代码,因此您不需要特定于libc的初始化,或者您应该复制所有_start()活动,包括您不知道的事项。后者看起来很虚伪。

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