编译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
相关产品推荐
相关产品推荐

