这是我的链接描述文件:
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上问好人是不会有害的。
答案 0 :(得分:1)
似乎LD链接器的默认行为是根据存储在只读存储器中的常量所需的任何对齐来分配不同的.rodata节。有关更多信息,请参阅此处: