You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译test-eval遇R_X86_64_32重定位错误,求解决方案

解决编译重定位错误的方法

问题原因

当前GCC默认生成位置独立可执行文件(PIE),但你的目标文件是用非PIE模式编译的,链接时就会触发R_X86_64_32重定位错误。之前添加-fPIE无效,是因为只在链接阶段加了该参数,而编译目标文件时没同步启用PIE编译规则。

修改Makefile的步骤

  1. 更新CFLAGS,添加-fPIE编译选项,确保所有目标文件都以PIE兼容模式编译:
    CFLAGS=-ggdb3 -Wall -Werror -pedantic -std=gnu99 -g -fPIE
    
  2. 添加链接选项LDFLAGS=-pie,用于生成符合标准的PIE可执行文件:
    LDFLAGS=-pie
    
  3. 简化并规范链接命令,统一使用预定义变量,避免重复参数:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:55:07