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

标签 linux gcc assembly nasm gnu-assembler

本实验在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

谢谢!

最佳答案

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

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

关于linux - 如何更改 gcc 生成的 asm 代码的入口点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737186/

相关文章:

assembly - 字和字操作数的大小是多少?

linux - 汇编 x86,在字符串中的每个单词后打印新行

linux - 如何在 Linux 中终止后台 while 循环?

php - cURL 从命令行获取响应 + 回调

ruby - 为什么安装 ruby​​ 需要 GCC?

c - 海湾合作委员会警告: assignment makes integer from pointer without a cast

arrays - MIPS:将用户输入字符串与内存中的字符串数组进行比较

c - 任何想法扩展我的 C 代码以使用 IPTC 库设置 IPv6 数据包中的 TOS 值

linux - linux下eclipse中sudo认证后加载JNI库出错

linux - 如何链接到特定的 glibc 版本?