C 防止\uuu开始入口点被优化

C 防止\uuu开始入口点被优化,c,gcc,optimization,C,Gcc,Optimization,使用以下CFLAGS: -Wall -Werror -Wextra -pedantic -std=c99 -O3 -nostartfiles -nodefaultlibs 我的\u start入口点(注意-nostartfiles)已成功编译并放入输出可执行文件 但是,当我添加-flto标志时,入口点和仅由其调用的函数都被优化了。此外,执行以下链接时既没有错误也没有警告,而是使用不正确的(随机)入口点 一个问题是如何防止\u start功能被优化。我也很感兴趣,为什么链接器“忘记”了我的入口点

使用以下
CFLAGS

-Wall -Werror -Wextra -pedantic -std=c99 -O3 -nostartfiles -nodefaultlibs
我的
\u start
入口点(注意
-nostartfiles
)已成功编译并放入输出可执行文件

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

一个问题是如何防止
\u start
功能被优化。我也很感兴趣,为什么链接器“忘记”了我的入口点上的外部依赖,而没有默认的

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


UPD:

源代码(在的帮助下修复,他在Windows ABI中编写了有关带前缀的下划线的内容):

  • -flto
    版本(注意这里缺少
    \u start
    ,只是API条目的一堆重击):

    节的反汇编。文本:
    00401000 :
    401000:ff 25 4c 30 40 00 jmp*0x40304c
    401006:90无
    401007:90无
    00401008 :
    401008:ff 25 54 30 40 00 jmp*0x403054
    40100e:90无
    40100f:90无
    00401010 :
    401010:ff(坏)
    401011:ff(坏)
    401012:ff(坏)
    401013:ff 00包括(%eax)
    401015:00添加%al,(%eax)
    ...
    00401018 :
    401018:ff(坏)
    401019:ff(坏)
    40101a:ff(坏)
    40101b:ff 00包括(%eax)
    40101d:00添加%al,(%eax)
    

  • 使用您设置的所有外来/嵌入式相关选项,您必须确保您的符号被视为入口点,而不是通过链接器优化进行垃圾收集(
    --gc sections
    也这样做:收集“无用”的节)

    由于无法访问任何节,因此可以得到一个完全空的
    .elf
    文件

    要告诉链接器您正在使用该符号作为入口点(并避免链接器避开它!),只需添加

    -Wl,-e\u启动


    链接命令的选项(或编写一个链接器规范文件,在其中声明符号,但命令行选项更简单)

    Source,请。还有,C还是C++?他们不是同一种语言。还有,你为什么要开始在那里?没有发出“开始”有什么问题?您是否尝试添加
    -Wl,-e\u开始
    以强制进入点?@Jean-Françoisfare不应该做任何事情,编译器中会发生LTO。@Arhad您是否尝试将入口点命名为
    \u开始
    ?在Windows ABI中,编译器会在C函数名中隐式添加前面的下划线,因此如果函数名为
    \uuuu start
    ,则符号实际上是
    \uuu start
    ,这是错误的。
    #include <windows.h>
    
    void _start()
    {
        MessageBox(NULL, TEXT("Hello world."), TEXT(""), MB_OK);
        ExitProcess(0);
    }
    
    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)
    
    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)