gpt4 book ai didi

c - 防止 __start 入口点被优化掉

转载 作者:行者123 更新时间:2023-12-03 16:52:32 25 4
gpt4 key购买 nike

与以下CFLAGS :

-Wall -Werror -Wextra -pedantic -std=c99 -O3 -nostartfiles -nodefaultlibs

我的 __start入口点(通知 -nostartfiles)已成功编译并放入输出可执行文件中。

但是,当我添加 -flto 时标志,入口点和仅由它调用的函数都被优化了。此外,执行以下链接时既没有错误也没有警告,但具有不正确的(随机)入口点。

一个问题是如何预防 __start功能被优化掉。对我来说,为什么链接器在缺少默认入口点的情况下“忘记”了对我的入口点的外部依赖,这也很有趣。

我的 GCC 版本是 gcc(i686-posix-dwarf-rev1,由 MinGW-W64 项目构建)4.9.2。

更新:

源代码(在 @FUZxxl 的帮助下修复,他写了关于 Windows ABI 中前置下划线的文章):
#include <windows.h>

void _start()
{
MessageBox(NULL, TEXT("Hello world."), TEXT(""), MB_OK);
ExitProcess(0);
}

链接器发出的汇编输出 ( -S ):
  • -flto版本:
    Disassembly of section .text:

    00401000 <__start>:
    401000: 83 ec 1c sub $0x1c,%esp
    401003: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp)
    40100a: 00
    40100b: c7 44 24 08 00 20 40 movl $0x402000,0x8(%esp)
    401012: 00
    401013: c7 44 24 04 0d 20 40 movl $0x40200d,0x4(%esp)
    40101a: 00
    40101b: c7 04 24 00 00 00 00 movl $0x0,(%esp)
    401022: ff 15 54 40 40 00 call *0x404054
    401028: 83 ec 10 sub $0x10,%esp
    40102b: c7 04 24 00 00 00 00 movl $0x0,(%esp)
    401032: ff 15 4c 40 40 00 call *0x40404c
    401038: 90 nop
    401039: 90 nop
    40103a: 90 nop
    40103b: 90 nop
    40103c: 90 nop
    40103d: 90 nop
    40103e: 90 nop
    40103f: 90 nop

    00401040 <__CTOR_LIST__>:
    401040: ff (bad)
    401041: ff (bad)
    401042: ff (bad)
    401043: ff 00 incl (%eax)
    401045: 00 00 add %al,(%eax)
    ...

    00401048 <__DTOR_LIST__>:
    401048: ff (bad)
    401049: ff (bad)
    40104a: ff (bad)
    40104b: ff 00 incl (%eax)
    40104d: 00 00 add %al,(%eax)
  • -flto版本(注意这里缺少 _start,只是一堆 API 条目的 thunk):
    Disassembly of section .text:

    00401000 <_ExitProcess@4>:
    401000: ff 25 4c 30 40 00 jmp *0x40304c
    401006: 90 nop
    401007: 90 nop

    00401008 <_MessageBoxA@16>:
    401008: ff 25 54 30 40 00 jmp *0x403054
    40100e: 90 nop
    40100f: 90 nop

    00401010 <__CTOR_LIST__>:
    401010: ff (bad)
    401011: ff (bad)
    401012: ff (bad)
    401013: ff 00 incl (%eax)
    401015: 00 00 add %al,(%eax)
    ...

    00401018 <__DTOR_LIST__>:
    401018: ff (bad)
    401019: ff (bad)
    40101a: ff (bad)
    40101b: ff 00 incl (%eax)
    40101d: 00 00 add %al,(%eax)
  • 最佳答案

    使用您设置的所有异国情调/嵌入相关选项,您必须确保您的符号被视为您的入口点,而不是链接器优化收集的垃圾(--gc-sections 也这样做:收集“无用”部分)

    您最终可能会得到一个完全空的 .elf文件,因为没有部分可访问。

    要告诉链接器您正在使用该符号作为入口点(并避免链接器避开它!),只需添加
    -Wl,-e__start
    链接命令的选项(或编写一个链接器规范文件,在其中声明您的符号,但命令行选项更容易)

    关于c - 防止 __start 入口点被优化掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39556307/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com