本实验在32位Linux上进行。
我想在asm层面做一个改造,我正在尝试实现 我在调用函数 main 之前的转换。
目前我正在尝试编写一个新的入口点,实现我的转换代码, 并希望这个新的入口点能够成功调用main
基本上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 的函数)并在这个新入口点的末尾调用 main?
谢谢!
最佳答案
我怀疑您是否应该替换 _start(),因为它是特定于平台和 libc 的。要么您在汇编程序中编写所有代码,这样您就不需要特定于 libc 的初始化,要么您应该复制所有 _start() 事件,包括您不知道的事情。后者看起来简直是假的。
如果您同意不替换 start() 而是使用一种机制在 main() 之前运行一些代码,请使用 __attribute__((constructor))
声明一个函数。这是记录在案的 GCC 扩展,它被积极使用,例如用于在 C++ 中初始化静态对象。这样的函数不能获取参数或返回实际值,也不能以其他方式覆盖控制流。我不明白你所说的“转型”是什么意思,所以它可能与你的意图相矛盾;如果是这样,您会更详细地解释这一点。
关于linux - 如何更改 gcc 生成的 asm 代码的入口点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737186/