使用ld链接汇编程序时,指定-dynamic-linker仍生成静态链接文件
问题解决:ld链接x86-64汇编程序体积过大(8KB vs 1KB)
核心原因
你的汇编代码直接通过syscall调用系统接口,完全不依赖任何动态库(比如libc),所以无论是否添加-dynamic-linker选项,生成的都是静态可执行文件——动态链接的前提是程序引用了动态库中的符号,而你这里没有这类引用,ld不会生成动态链接的文件。
体积偏大是因为ld默认的链接配置包含了额外的段、页面对齐要求,以及未剥离的符号表等冗余内容,而教程中使用了精简的链接配置。
解决方法
通过ld的精简选项或自定义链接脚本,去除冗余内容:
方法1:使用ld内置精简选项
执行以下链接命令:
ld -o hello64 hello64.o --strip-all --nmagic
--strip-all:剥离所有符号表和调试信息,大幅减小体积--nmagic:关闭页面对齐,避免因对齐产生的空字节填充
方法2:使用自定义极简链接脚本
创建一个名为link.ld的链接脚本,内容如下:
SECTIONS { . = 0x400000; # x86-64程序默认的起始地址 .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
然后用该脚本链接:
ld -o hello64 hello64.o -T link.ld --strip-all
验证结果
执行后再查看文件:
$ file hello64 hello64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped $ wc -c hello64 1200 hello64 # 体积接近教程中的1KB
内容的提问来源于stack exchange,提问作者DeceptiveRat
相关产品推荐
相关产品推荐

