编译test-eval遇R_X86_64_32重定位错误,求解决方案
解决编译重定位错误的方法
问题原因
当前GCC默认生成位置独立可执行文件(PIE),但你的目标文件是用非PIE模式编译的,链接时就会触发R_X86_64_32重定位错误。之前添加-fPIE无效,是因为只在链接阶段加了该参数,而编译目标文件时没同步启用PIE编译规则。
修改Makefile的步骤
- 更新
CFLAGS,添加-fPIE编译选项,确保所有目标文件都以PIE兼容模式编译:CFLAGS=-ggdb3 -Wall -Werror -pedantic -std=gnu99 -g -fPIE - 添加链接选项
LDFLAGS=-pie,用于生成符合标准的PIE可执行文件:LDFLAGS=-pie - 简化并规范链接命令,统一使用预定义变量,避免重复参数:
这里test-eval: deck.o eval.o eval-c4.o test-eval.o deck-c4.o cards.o input.o future.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ poker: $(GIVEN_OBJS) $(MY_OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^$@代表目标文件名,$^代表所有依赖的目标文件,既简洁又不容易出错。
修改后的完整Makefile
CFLAGS=-ggdb3 -Wall -Werror -pedantic -std=gnu99 -g -fPIE LDFLAGS=-pie GIVEN_OBJS=deck-c4.o eval-c4.o future.o input.o main.o MY_OBJS=cards.o deck.o eval.o test-eval: deck.o eval.o eval-c4.o test-eval.o deck-c4.o cards.o input.o future.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ poker: $(GIVEN_OBJS) $(MY_OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ clean: rm -f test poker cards.o my-test-main.o *~
为什么这样有效
-fPIE让编译器生成位置独立的目标文件,适配PIE链接规则;-pie告诉链接器生成PIE格式的可执行文件,匹配现代系统的安全要求;- 统一使用
$(CC)(默认指向gcc)和预定义变量,确保编译、链接阶段的参数一致,避免出现编译和链接规则不匹配的情况。
内容的提问来源于stack exchange,提问作者Kash
相关产品推荐
相关产品推荐

