如何让GCC链接器不生成PHDR,输出Flat File?
生成无PHDR的Flat File解决方案
现代GCC配套的ld链接器默认强制ELF输出包含PHDR(程序头表),直接生成无PHDR的文件会触发报错。针对你的问题,以下是可行的解决方法:
方法一:链接脚本+objcopy转换(最可靠)
- 编写基础链接脚本(无需定义PHDRS),示例如下:
ENTRY(_start) SECTIONS { . = 0x0; # 起始地址根据需求调整 .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
- 编译链接时添加
-Wl,--noinhibit-exec参数,忽略no sections assigned to phdrs错误,生成ELF文件:
gcc -T your_script.ld -Wl,--noinhibit-exec -o temp.elf your_source.c
- 使用
objcopy将ELF转换为纯Flat File,自动剥离所有ELF头部、PHDR等额外信息:
objcopy -O binary temp.elf final.flat
方法二:直接通过链接脚本输出二进制
在链接脚本中指定输出格式为binary,ld会直接生成纯二进制文件,无需后续转换:
OUTPUT_FORMAT("binary") ENTRY(_start) SECTIONS { . = 0x0; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
编译链接命令:
gcc -T your_script.ld -o final.flat your_source.c
注:部分ld版本对方法二存在兼容性问题,若遇到异常优先使用方法一。
内容的提问来源于stack exchange,提问作者Charles Lohr
相关产品推荐
相关产品推荐

