gpt4 book ai didi

gcc-4.1 -> gcc-4.8 链接器错误。新的 ".text.unlikely"部分重叠 ".text"部分

转载 作者:行者123 更新时间:2023-12-04 22:14:17 24 4
gpt4 key购买 nike

我正在尝试使用更新版本的 gcc 构建克伦威尔(原始 Xbox 合法固件替换),但在稍微更改项目编译设置后,ld 引发以下错误:

ld: section .text.unlikely loaded at [0000000000000000,0000000000000669] overlaps section .text loaded at [0000000000000000,0000000000021515]



如果你想看看,你可以从这里克隆项目: https://github.com/not404/cromwell

首先,我想提一下,我能够在 x32 linux VM 上使用 gcc-3.3 和在 cygwin x86 上使用 gcc-4.1(为目标 i686-linux-gnu 构建 gcc)成功构建和运行这个项目(在我的 Xbox 上) .我不得不删除 -Werror主 Makefile 中的 cflag 以在 gcc-3.3 中成功构建它。在修改 makefile 后尝试在 x32 VM 上使用 gcc-4.8.2 构建它会导致上述错误。

为了到达那里,我修改了项目根目录下 Makefile 中的 CFLAGS。我还有 -Werror从 CLAGS 中删除。我不得不添加 -fno-stack-protector CFLAGS 中的标志和 ETH_CFLAGS越过 undefined reference to '__stack_chk_fail'错误。我认为这种解决方法是无害的。较旧的 gcc 版本不支持这种堆栈粉碎保护机制,因此禁用它应该不会造成问题。

在对 Makefile 进行修改后,我看到了有关部分重叠的链接器错误。我读到 .text.unlikely部分是在 gcc 4.6 周围添加的,所以很明显在积极开发克伦威尔项目时没有考虑它!

所以,为了克服这个错误,我试图明确定义 .text.unlikely “ldscript-crom.ld”链接描述文件中的部分。最初,脚本包含以下内容:
.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_frame loaded at [0000000000000000,00000000000062b3] overlaps section .text loaded at [0000000000000000,0000000000021b7f]



从我在互联网上阅读的内容来看, .eh_frame部分仅与异常处理相关,并针对 C++ 捕获异常。

我能够通过将以下标志添加到主 Makefile 中的 CFLAGS 和 EHT_CFLAGS 来解决此问题:
-fno-reorder-functions -fno-unwind-tables -fno-asynchronous-unwind-tables 

毕竟,我终于得到了一个输出文件。不幸的是,执行中有错误。它似乎开始得很好,但我没有得到视频,而且执行似乎在某个时候崩溃了。

我尝试打印链接文件的 map ,但没有看到任何相关内容。我不会在这里发布 2 张 map (使用 gcc-3.3 和使用 gcc-4.8,相同的 ld),因为它们非常大。这是包含 .text.unlikely 的 map 部分部分定义(来自 gcc-4.8):
                0x0000000003a216f0                disable
*fill* 0x0000000003a2170e 0x2
.text 0x0000000003a21710 0x165 /home/cromwelldev/workspace/cromwell/obj/xbox_main.o
0x0000000003a21710 loadkernel
0x0000000003a21870 cleanup
*fill* 0x0000000003a21875 0xb
.text 0x0000000003a21880 0x2b5 /home/cromwelldev/workspace/cromwell/obj/elf.o
0x0000000003a21880 prepare_boot_params
0x0000000003a21b20 elf_start
*fill* 0x0000000003a21b35 0xb
.text 0x0000000003a21b40 0x46 /home/cromwelldev/workspace/cromwell/obj/exec_elf.o
0x0000000003a21b40 try_elf_boot
*(.text.unlikely)
0x0000000003a21b86 _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 0x0000000003a21b86 0x108b1 load address 0x0000000000021b86
*(.rodata)
*fill* 0x0000000003a21b86 0x2

这是 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.unlikely我放在链接器脚本中的部分。我必须说我在这里迷路了。我对链接器脚本不太熟悉,所以我真的不知道该怎么做。

有没有办法在不分离 .text.unlikely 的情况下构建项目来自 .text 其余部分的部分部分?这会是解决我问题的一种方法吗?

我也觉得 -fno-reorder-functions -fno-unwind-tables -fno-asynchronous-unwind-tables标志不能解决我的问题。在这样的项目中,有些元素需要位于特定的内存位置,我担心这些标志会以不好的方式移动东西!

先感谢您!

最佳答案

根据 GCC docs链接器可能会选择将内容放入部分 .text.hot.text.unlikely如果选项 -freorder-functions已激活(这是优化级别 -O2、-O3、-Os 的默认设置)。
取决于它是否“认为”经常调用一个函数。我想如果您的硬件具有快速和慢速内存区域之类的东西,这可能会给您一些优化潜力。
如果没有 - 只需将这些部分添加到 .text 应该没问题。

关于gcc-4.1 -> gcc-4.8 链接器错误。新的 ".text.unlikely"部分重叠 ".text"部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260909/

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