gcc-4.1->;gcc-4.8链接器错误。新的;。“不太可能”;“节重叠”;。“文本”;部分

gcc-4.1->;gcc-4.8链接器错误。新的;。“不太可能”;“节重叠”;。“文本”;部分,gcc,makefile,linker,linker-errors,linker-scripts,Gcc,Makefile,Linker,Linker Errors,Linker Scripts,我正在尝试使用较新版本的gcc构建cromwell(原始Xbox合法固件更换版),但在稍微更改项目编译设置后,ld抛出以下错误: ld:section.text.com在[000000000000000000000000669]处加载与section.text在[00000000000000000000021515]处加载重叠 如果要查看,可以从此处克隆项目: 首先也是最重要的一点,我想提及的是,我能够在x32 linux虚拟机上使用gcc-3.3和cygwin x86上使用gcc-4.1(为目

我正在尝试使用较新版本的gcc构建cromwell(原始Xbox合法固件更换版),但在稍微更改项目编译设置后,ld抛出以下错误:

ld:section.text.com在[000000000000000000000000669]处加载与section.text在[00000000000000000000021515]处加载重叠

如果要查看,可以从此处克隆项目:

首先也是最重要的一点,我想提及的是,我能够在x32 linux虚拟机上使用gcc-3.3和cygwin x86上使用gcc-4.1(为目标i686 linux gnu构建gcc)成功构建和运行这个项目(在我的Xbox上)。我必须删除主Makefile中的
-Werror
cflag,才能在gcc-3.3中成功构建它。修改makefile后,尝试在x32虚拟机上使用gcc-4.8.2构建它会导致上述错误

为了达到这个目的,我修改了项目根目录下Makefile中的CFLAGS。我仍然将
-Werror
从CLAGS中删除。我必须在
CFLAGS
ETH\u CFLAGS
中添加
-fno stack protector
标志,以通过
未定义的引用“\uu stack\u chk\u fail”
错误。我认为这种变通方法是无害的。较旧的gcc版本不支持这种破坏堆栈的保护机制,所以禁用它不会带来问题

在对Makefile进行修改之后,我看到了关于节重叠的链接器错误。我读到,
.text.allowed
部分是围绕gcc 4.6添加的,因此显然在积极开发克伦威尔项目时没有考虑它

因此,为了克服这个错误,我尝试在“ldscript crom.ld”链接器脚本中明确定义
.text.allowed
部分。最初,脚本包含以下内容:

.text LOW_ROM : AT ( 0 ){
    _start_low_rom = . ;
    *(.text);
    _end_low_rom = . ;
}
我把它改成:

    .text LOW_ROM : AT ( 0 ){
    _start_low_rom = . ;
    *(.text);
    *(.text.unlikely);
    _end_low_rom = . ;
}
在进行此更改之后,我又遇到另一个错误:

ld:section.eh_在[0000000000000000000000000000062b3]处加载的帧与section重叠。在[00000000000000000000000000021b7f]处加载的文本

从我在网上看到的, EHFrase节只涉及异常处理,C++的目标是捕捉异常。 我可以通过向主Makefile中的CFLAGS和EHT_CFLAGS添加以下标志来修复此问题:

-fno-reorder-functions -fno-unwind-tables -fno-asynchronous-unwind-tables 
在所有这些之后,我终于得到了一个输出文件。不幸的是,执行中存在错误。这似乎是一个良好的开端,但我没有得到视频和执行似乎崩溃在某个点

我试图打印链接文件的地图,但没有看到任何相关内容。我不会在这里发布这两个地图(使用gcc-3.3和gcc-4.8,相同的ld),因为它们非常大。以下是包含
.text.部分定义(来自gcc-4.8)的地图部分:

以下是gcc-3.3中的相同部分:

                    0x0000000003a1f7a0                disable
     *fill*         0x0000000003a1f7c2        0xe 
     .text          0x0000000003a1f7d0      0x165 /home/cromwelldev/workspace/cromwell/obj/xbox_main.o
                    0x0000000003a1f7d0                loadkernel
                    0x0000000003a1f930                cleanup
     *fill*         0x0000000003a1f935        0xb 
     .text          0x0000000003a1f940      0x2b6 /home/cromwelldev/workspace/cromwell/obj/elf.o
                    0x0000000003a1f940                prepare_boot_params
                    0x0000000003a1fbe0                elf_start
     *fill*         0x0000000003a1fbf6        0xa 
     .text          0x0000000003a1fc00       0x33 /home/cromwelldev/workspace/cromwell/obj/exec_elf.o
                    0x0000000003a1fc00                try_elf_boot
                    0x0000000003a1fc33                _end_low_rom = .

    .iplt           0x0000000000000000        0x0
     .iplt          0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o

    .rel.dyn        0x0000000000000000        0x0
     .rel.iplt      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o
     .rel.text      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o
     .rel.data      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o

    .rodata         0x0000000003a1fc33    0x11024 load address 0x000000000001fc33
     *(.rodata)
我认为问题出在链接器脚本中的
.text.部分。我得说我在这里迷路了。我不太熟悉链接器脚本,所以我真的不知道该怎么做

是否有一种方法可以在不将
.text.部分与
.text
部分的其余部分分离的情况下构建项目?这是解决我问题的方法吗

我还认为
-fno reorder函数-fno unwind tables-fno asynchronous unwind tables
标志并不能解决我的问题。在这样的项目中,有一些元素需要放在特定的内存位置,我担心这些标志会以一种不好的方式移动东西

提前谢谢你


Ben

您是如何修复有关
.text的错误的。不太可能
重叠
.text
实际上是正确的-链接器错误是由链接器“punting”开始
.text引起的。不太可能
部分位于加载地址0,因为链接器脚本没有指定它要去的任何地方。重复
.eh\u frame
部分的链接器脚本更改,并删除
-fno reorder函数-fno unwind tables-fno asynchronous unwind tables
编译器标志,应该可以更正关于
.eh\u frame
重叠
.text
的错误,而不会在下游造成进一步的问题。

根据链接器可能会选择将内容放入
.text.hot
.text.部分中。如果选项
-freorder函数
被激活(默认为优化级别-O2,-O3,-Os)。
取决于它是否“认为”函数被频繁调用。如果您的硬件具有快速和慢速内存区域,我想这可能会给您带来一些优化潜力。
如果没有-只需将这些部分添加到.text就可以了

                    0x0000000003a1f7a0                disable
     *fill*         0x0000000003a1f7c2        0xe 
     .text          0x0000000003a1f7d0      0x165 /home/cromwelldev/workspace/cromwell/obj/xbox_main.o
                    0x0000000003a1f7d0                loadkernel
                    0x0000000003a1f930                cleanup
     *fill*         0x0000000003a1f935        0xb 
     .text          0x0000000003a1f940      0x2b6 /home/cromwelldev/workspace/cromwell/obj/elf.o
                    0x0000000003a1f940                prepare_boot_params
                    0x0000000003a1fbe0                elf_start
     *fill*         0x0000000003a1fbf6        0xa 
     .text          0x0000000003a1fc00       0x33 /home/cromwelldev/workspace/cromwell/obj/exec_elf.o
                    0x0000000003a1fc00                try_elf_boot
                    0x0000000003a1fc33                _end_low_rom = .

    .iplt           0x0000000000000000        0x0
     .iplt          0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o

    .rel.dyn        0x0000000000000000        0x0
     .rel.iplt      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o
     .rel.text      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o
     .rel.data      0x0000000000000000        0x0 /home/cromwelldev/workspace/cromwell/obj/BootStartup.o

    .rodata         0x0000000003a1fc33    0x11024 load address 0x000000000001fc33
     *(.rodata)