将a.c
视为包含:
void _start(void);
void _start(void) { while (1); }
在gcc 5.4.0
上使用Ubuntu
,以下命令会生成类型为ELF
且没有外部依赖关系的EXEC
文件:
gcc -o ./a -x c ./a.c -nostartfiles -nostdlib -nodefaultlibs
但是,gcc 6.4.0
上Gentoo
的相同命令会生成ELF
文件,其类型为DYN
,请求标准程序解释程序/lib64/ld-linux-x86-64.so.2
。
那么,如何使用EXEC
生成真正的独立gcc 6.4.0
二进制文件?
答案 0 :(得分:0)
找到它。必须指定-no-pie
。
答案 1 :(得分:0)
您需要构建非PIE模式以创建与位置相关的可执行文件。这包括两个步骤:
-fno-pie
汇总。-no-pie
。将编译为PIE的代码链接到与位置相关的可执行文件可以正常工作,但会导致性能下降和更大的可执行文件。