2013-12-23 53 views
0

这个实验是在32位的Linux上。如何更改gcc生成的asm代码的入口点?

我想对asm级别进行转换,并且在调用函数主要之前尝试执行 我的转换。

目前我正在尝试一种新的切入点进行编程,实现我转换代码, ,并希望在新的切入点,可以成功地调用主要

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

的C代码:

int main() 
{ 
    return 0; 
} 

我使用该命令来生成汇编代码:

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 

谁能告诉我如何实现一个新的切入点(可能是一个功能similiar像_start)和呼叫主要末这个新的入口点?

谢谢!

+1

相关:http://stackoverflow.com/questions/8116648/ – Nemo

+1

你将如何调用你的新入口点?否则,考虑重写'crt * .o'启动。学习GCC 4.8.2源代码! –

+1

当你链接你的代码时,你可以使用'-e'开关决定入口点... 例如:'ld -o output_file_name obj_file.o -lc -dynamic-linker /lib/ld-linux-so.2 -e _start' – Sam

回答

2

我怀疑你应该替换_start(),因为它非常适合平台和libc。要么你用汇编编写所有代码,所以你不需要libc特定的初始化,或者你应该复制所有_start()活动,包括你不知道的东西。后者看起来简直是假的。

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

+0

谢谢你的回答,现在我知道它应该不是一个好主意,实现__start()像函数。 。但我认为__attribute __((构造函数))应该在c/C++代码级别添加,而不是在汇编级别。 – computereasy

+0

@computereasy在GCC中,所有功能指定在c/C++代码级别生成汇编输出,而后者是编译成目标代码。这是主要的GCC模式,所以在实现这个属性的时候它并不重要,它仍然可以工作。 – Netch