我希望在Linux上编译以下程序:
然而,它给我以下链接器错误:
我该如何配置gcc默认使用
.global _start
.text
_start:
mov $1, %rax
mov $1, %rdi
mov $msg, %rsi
mov $13, %rdx
syscall
mov $60, %rax
xor %rdi, %rdi
syscall
msg:
.ascii "Hello World!\n"
然而,它给我以下链接器错误:
$ gcc -nostdlib hello.s
/usr/bin/ld: /tmp/ccMNQrOF.o: relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
我想到原因是因为gcc默认使用-pie
生成共享对象,所以使用-no-pie
可以解决问题:
$ gcc -no-pie -nostdlib hello.s
$ ./a.out
Hello World!
我该如何配置gcc默认使用
-no-pie
?我正在使用Arch Linux。
--enable-default-pie
配置的 gcc 是一种安全加固策略,因为它默认构建位置无关二进制文件。默认情况下不构建 pie 二进制文件可能会更不安全,但不应该会导致任何问题。 - ks1322