这个实验是在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 吗?
谢谢!
答案 0 :(得分:2)
我怀疑你应该替换_start(),因为它是特定于平台和libc的。您可以在汇编程序中编写所有代码,因此您不需要特定于libc的初始化,或者您应该复制所有_start()活动,包括您不知道的事项。后者看起来很虚伪。
如果您同意不替换start()但使用机制在main()之前运行某些代码,请使用__attribute__((constructor))
声明一个函数。这是GCC扩展的记录,并且它是积极使用的,例如用于在C ++中初始化静态对象。这样的函数不能获得参数或返回实际值,也不能以另一种方式覆盖控制流。我无法理解你对“转型”的意思,所以它可能与你的意图相矛盾;如果是这样,你会更详细地解释这一点。