gpt4 book ai didi

linux - 为什么有多个 .rodata 段被映射到 LOAD 段,而链接描述文件中只指定了一个 .rodata 输出段?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:54 29 4
gpt4 key购买 nike

这是我的链接描述文件:

ENTRY(__startup)
SECTIONS
{
. = 0x0000;
.text : { *(.text) }
. = . + 0x4000;
.rodata :
{
*(.rodata)
*(.rodata.*)
}
.bss : { *(.bss) }
.data : { *(.data) }
}

足够简单。但是,当所有目标文件都链接在一起并且我查看可执行文件的段映射时,我得到以下信息:

Elf file type is EXEC (Executable file)
Entry point 0x0
There are 6 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0xfffff034 0xfffff034 0x000c0 0x000c0 R 0x4
LOAD 0x000000 0xfffff000 0xfffff000 0x000f4 0x000f4 R 0x1000
LOAD 0x001000 0x00000000 0x00000000 0x01a18 0x01a18 R E 0x1000
LOAD 0x002a18 0x00005a18 0x00005a18 0x00038 0x00038 R 0x1000
LOAD 0x002a50 0x00005a50 0x00005a50 0x0010c 0x0010c RW 0x1000
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0

Section to Segment mapping:
Segment Sections...
00
01
02 .text
03 .rodata .rodata
04 .bss .bss .data
05

对程序执行 objdump 也会显示两个 .rodata 部分。我运行的系统是 ubuntu 16.0.4,我的编译器是 gcc(我使用的是 LD,GNU 链接器)。

有谁知道为什么编译会产生两个同名的输出段?有没有办法强制它成为一个?这完全有可能不仅仅是关于命令语言脚本的一般性问题,但由于我无法显示我正在使用的代码库,我仍然认为向 Stack Overflow 上的好人提问不会有什么坏处。

最佳答案

LD 链接器的默认行为似乎是根据存储在只读存储器中的常量所需的对齐方式分配不同的 .rodata 部分。有关详细信息,请参阅此处:

what does `.rodata.str1.8` section mean in elf file

关于linux - 为什么有多个 .rodata 段被映射到 LOAD 段,而链接描述文件中只指定了一个 .rodata 输出段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897140/

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