gcc-4.1->;gcc-4.8链接器错误。新的;。“不太可能”;“节重叠”;。“文本”;部分
我正在尝试使用较新版本的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中的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(为目
-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]处加载的文本
从我在网上看到的,
-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)