如何配置GCC在Arch Linux下默认使用-no-pie选项?
在Arch Linux中配置GCC默认启用
-no-pie 遇到GCC默认用-pie导致的链接错误?别担心,在Arch Linux上有几种简单的方法可以让GCC默认启用-no-pie,根据你的需求选就行:
方法1:临时生效(当前终端会话)
如果只是临时测试,不想改动永久配置,可以直接在终端里设置环境变量——GCC会自动读取这些变量作为默认编译/链接参数:
export CFLAGS="-no-pie" export LDFLAGS="-no-pie"
这个设置只在当前终端窗口有效,关闭终端后就会恢复默认,适合临时调试场景。
方法2:全局永久生效(所有用户)
如果想让所有用户的GCC都默认用-no-pie,可以修改Arch系统的全局编译配置文件/etc/makepkg.conf:
- 用文本编辑器打开配置文件(需要管理员权限):
sudo nano /etc/makepkg.conf - 找到
CFLAGS和LDFLAGS这两行,把其中的-pie替换成-no-pie;如果原来的参数里没有-pie,直接在末尾添加-no-pie(注意前面要加空格)。
举个修改后的示例:CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -no-pie" LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -no-pie" - 保存并退出编辑器(nano中按
Ctrl+O保存,Ctrl+X退出)。 - 之后新启动的终端都会自动应用这个配置,所有用户的GCC编译都会默认带上
-no-pie。
方法3:用户个人永久生效(仅当前用户)
如果不想影响其他用户,只给自己的账号配置默认-no-pie,可以修改shell的配置文件(bash用~/.bashrc,zsh用~/.zshrc):
- 打开配置文件:
nano ~/.bashrc - 在文件末尾添加两行:
export CFLAGS="-no-pie" export LDFLAGS="-no-pie" - 保存退出后,执行下面的命令让配置立即生效:
以后每次登录你的账号,这个配置都会自动加载。source ~/.bashrc
验证配置是否生效
写个简单的测试程序test.c:
#include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
用GCC编译:
gcc test.c -o test
然后用file命令查看生成的可执行文件类型:
file test
如果输出里没有PIE executable,而是显示ELF 64-bit executable(动态或静态链接),就说明-no-pie已经默认生效了。
注意事项
修改全局makepkg.conf会影响所有系统包和AUR包的构建,有些软件可能依赖PIE特性,所以如果只是自己写的程序需要-no-pie,优先用用户个人配置或临时配置,避免破坏系统包的兼容性。
内容的提问来源于stack exchange,提问作者Aadit M Shah
相关产品推荐
相关产品推荐

