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

编译Binutils的gas与gold时jmp_table多重定义错误的解决求助

问题:编译Binutils的gas和gold工具时出现重复定义错误

我在编译Binutils的gas和gold工具时遇到了如下错误,先后更换gcc-7、gcc-8、gcc-11多个版本都没解决。

编译脚本

echo -e "${BLUE}===================== build gas && gold ===========================${NC}"
echo

if [ ! -f ${PWD_PATH}/succeed/binutils ]; then
    wget -c 'https://ftp.gnu.org/gnu/binutils/binutils-2.30.tar.xz'
    tar xvJf binutils-2.30.tar.xz
    rm -r binutils-2.30/gas
    rm -r binutils-2.30/gold

    cp -r ${SRC_PATH}/binutils/gas-2.30 ${GAS_DIR}

    cp -r ${SRC_PATH}/binutils/gold-2.30 ${GOLD_DIR}

    cp $PROTODEF_DIR/$C_HDR $GAS_DIR

    cp $PROTODEF_DIR/$CC_HDR ${GOLD_DIR}/
    cp $PROTODEF_DIR/$PROTO_C ${GOLD_DIR}/

    eval "cd $PWD_PATH/binutils-2.30 && mkdir -p build && cd build"

    CFLAGS="`pkg-config --cflags 'libprotobuf-c >= 1.0.0'`" LDFLAGS=`pkg-config --libs 'libprotobuf-c >= 1.0.0'` \
            ../configure --enable-gold --prefix=${PWD_PATH}/executable_binutils \
            --disable-werror --enable-shared \
             --enable-ld=default \
         --enable-plugins    \
             --enable-64-bit-bfd \
             --with-system-zlib \
            && make -j$(nproc)
            # && make install
    echo "done" > ${PWD_PATH}/succeed/binutils
fi

echo
echo -e "${GREEN}[*] build gas&&gold succeed!${NC}"

GAS_PATH=$PWD_PATH/binutils-2.30/build/gas/as-new
GOLD_PATH=$PWD_PATH/binutils-2.30/build/gold/ld-new

# get gcc-8.1.0
GCC_PATH="$PWD_PATH/gcc-8.1.0"
# GCC_EXE_PATH="$PWD_PATH/gcc_executable"
#GCC_EXE_PATH=""
GCC_BUILD_PATH="$PWD_PATH/build_gcc"
GCC_EXE_PATH="$PWD_PATH/executable_gcc"


# soft link gas
eval " sudo cp /usr/bin/as /usr/bin/as.old"
echo

错误信息

/usr/local/bin/ld: error: symbols.o: multiple definition of 'jmp_table'
/usr/local/bin/ld: ehopt.o: previous definition here
/usr/local/bin/ld: error: bbInfoHandle.o: multiple definition of 'jmp_table'
/usr/local/bin/ld: ehopt.o: previous definition here
/usr/local/bin/ld: error: obj-elf.o: multiple definition of 'jmp_table'
/usr/local/bin/ld: ehopt.o: previous definition here

解决方法

这种重复定义错误是因为jmp_table变量在多个源文件中被直接定义(而非声明),导致链接时符号冲突。按以下步骤修复:

  • 定位重复定义的位置
    先搜索gold目录下所有包含jmp_table的文件:

    grep -r "jmp_table" ${PWD_PATH}/binutils-2.30/gold/
    

    重点检查头文件,大概率是某个头文件里直接写了变量定义,而非外部声明。

  • 修正变量声明规则

    • 在头文件中,将jmp_table的定义改为外部声明:
      extern [变量类型] jmp_table; // 替换[变量类型]为实际类型,比如int、数组等
      
    • 只在唯一的一个源文件(比如ehopt.c)中保留jmp_table的实际定义:
      [变量类型] jmp_table; // 仅在单个文件中写此定义
      
  • 检查自定义引入的文件
    你编译时复制了PROTODEF_DIR下的头文件和C文件到gold目录,这些自定义文件可能也定义了jmp_table。检查这些文件,确保没有重复定义,必要时同样用extern声明替代定义。

  • 清理后重新编译
    先清理之前的编译产物,再重新构建:

    cd ${PWD_PATH}/binutils-2.30/build
    make clean
    CFLAGS="`pkg-config --cflags 'libprotobuf-c >= 1.0.0'`" LDFLAGS=`pkg-config --libs 'libprotobuf-c >= 1.0.0'` \
    ../configure --enable-gold --prefix=${PWD_PATH}/executable_binutils \
    --disable-werror --enable-shared \
    --enable-ld=default \
    --enable-plugins    \
    --enable-64-bit-bfd \
    --with-system-zlib \
    && make -j$(nproc)
    

内容的提问来源于stack exchange,提问作者NobinPegasus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:17:08