编译出错Relocations in generic ELF (EM: 62)

本文记录了一次交叉编译libnl时遇到的错误及其解决过程。问题源于预编译的libnl.a静态库与目标平台不匹配,通过删除错误的库文件并重新编译解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在交叉编译libnl的时候,出错了,信息如下:

编译出错

aarch64-linux-gnu-gcc -L/mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib --static  -o wpa_supplicant config.o notify.o bss.o eap_register.o ../src/utils/common.o ../src/utils/wpa_debug.o ../src/utils/wpabuf.o wmm_ac.o ../src/utils/os_unix.o ../src/utils/eloop.o config_file.o ../src/rsn_supp/wpa.o ../src/rsn_supp/preauth.o ../src/rsn_supp/pmksa_cache.o ../src/rsn_supp/peerkey.o ../src/rsn_supp/wpa_ie.o ../src/common/wpa_common.o ../src/eap_peer/eap_tls.o ../src/eap_peer/eap_peap.o ../src/eap_common/eap_peap_common.o ../src/eap_peer/eap_ttls.o ../src/eap_peer/eap_md5.o ../src/eap_peer/eap_mschapv2.o ../src/eap_peer/mschapv2.o ../src/eap_peer/eap_gtc.o ../src/eap_peer/eap_otp.o ../src/eap_peer/eap_leap.o ../src/eapol_supp/eapol_supp_sm.o ../src/eap_peer/eap.o ../src/eap_peer/eap_methods.o ../src/crypto/ms_funcs.o ../src/eap_common/chap.o ../src/eap_peer/eap_tls_common.o ../src/crypto/tls_openssl.o ../src/crypto/tls_openssl_ocsp.o ../src/crypto/crypto_openssl.o    ../src/crypto/sha256-prf.o ../src/crypto/sha256-tlsprf.o ../src/crypto/random.o ../src/common/ctrl_iface_common.o ctrl_iface.o ctrl_iface_unix.o  ../src/utils/base64.o sme.o ../src/common/ieee802_11_common.o ../src/common/hw_features_common.o ../src/eap_common/eap_common.o ../src/crypto/sha1-prf.o ../src/crypto/sha1-tlsprf.o  ../src/drivers/driver_common.o wpa_supplicant.o events.o blacklist.o wpas_glue.o scan.o main.o  ../src/drivers/driver_wext.o  ../src/drivers/driver_wired.o ../src/drivers/driver_nl80211.o ../src/drivers/driver_nl80211_capa.o ../src/drivers/driver_nl80211_event.o ../src/drivers/driver_nl80211_monitor.o ../src/drivers/driver_nl80211_scan.o ../src/drivers/netlink.o ../src/drivers/linux_ioctl.o ../src/drivers/rfkill.o ../src/utils/radiotap.o ../src/drivers/drivers.o ../src/l2_packet/l2_packet_linux.o -L/mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib -lrt   -lnl -lssl -lcrypto -ldl  
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frankyu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../lib/gcc/aarch64-linux-gnu/4.9.2/../../../../aarch64-linux-gnu/bin/ld: /mnt/nfsroot/frank.yu/android-O/factorytest/wifi/out/lib/libnl.a(family.o): Relocations in generic ELF (EM: 62)
/mnt/nfsroot/frank.yu/android-mbr-p212/factorytest/wifi/out/lib/libnl.a: error adding symbols: File in wrong format

错误信息是:libnl.a(family.o): Relocations in generic ELF (EM: 62)
通过查看静态库libnl.a中的文件 family.o, 发现elf64-x86-64,这个真是奇怪了

objdump -a libnl.a

cache.o:     file format elf64-little
rw-r--r-- 9150/8000  79640 Apr 14 12:01 2018 cache.o

family.o:     file format elf64-little
rw-r--r-- 9150/8000  14912 Apr 14 12:01 2018 family.o

family.o:     file format elf64-x86-64
rw-rw-r-- 1000/1000  42176 Dec 20 19:33 2012 family.o

nl.o:     file format elf64-little
rw-r--r-- 9150/8000  51840 Apr 14 12:01 2018 nl.o

重新解压了一个libnl-1.1.4.tar.gz,发现没有任何编译,lib目录竟然存在libnl.a, 原来是源码的上传者,使用的是x86-64的交叉编译器编译生成的libnl.a, 然后上传了。这样导致我这边出错了,然后把libnl.a删除了,重新编译就没有报错了。
rm lib/libnl.a
### 回答1: 这个问题涉及到ELF格式文件中的relocation部分。relocation是指在代码执行时需要动态绑定或修改的地址,例如函数调用或全局变量。在ELF文件中,relocation记录了需要修改的地址和修改方式。em:40是指对应的ELF文件所使用的架构为x86-64。 ### 回答2: Relocations in generic ELF(Executable and Linkable Format)是指在编译和链接过程中需要对代码或数据进行修改的操作。这些修改通常是由于跨越链接时不同的内存布局而导致的。 在ELF文件中,每个节(section)都有一个对应的重定位节(relocation section),它记录下了需要修正的地址和修正方式。重定位表(entry)通常包括了被修正的段(section)、修正的地址、修正的类型(relocation type)以及必要的符号信息(symbol information)等。 重定位是在链接时完成的,用于将不同的目标文件中的符号链接到正确的地址。在链接器将所有目标文件链接成一个可执行文件时,需要对每个符号进行重定位。在这个过程中,链接器根据重定位表中的信息计算出被修正的地址和修正方式,并将这些信息保存在可执行文件中,最终得到一个可以在特定的内存位置上运行的可执行文件。 总之,重定位是ELF格式中非常重要的一部分,它确保了可执行文件可以在不同的内存位置上正确运行。了解重定位的机制,可以帮助我们更好地理解可执行文件的链接过程。 ### 回答3: 在 ELF(Executable and Linkable Format)文件中,重定位是指在程序加载时,调整程序的代码和数据的地址的过程。在ELF文件的头部中,有一个字段称为节头表(Section Header Table),它包含了程序的各个部分,如代码、数据、符号表等等。而在重定位中,涉及的主要是代码和数据。每个代码或数据段都是由一个或多个节(Section)组成的,而每个节都描述了它在文件中的位置和在内存中的位置。 重定位的目的是使程序能够正确运行,并能够在任何地址空间中执行。当程序被加载时,操作系统负责找到每个段在内存中的位置,并将其复制到正确的位置。操作系统也修改了代码和数据中的地址,以便它们指向正确的位置。这个过程中,需要发现程序中所有的重定位项(Relocation Entries),并将它们修改为正确的地址。在读取完整个 ELF 文件后,我们可以看到每个节标志(Section Flag)设置中是否包含了 RELA 或 REL(Relocation) 标志。这就意味着 ELF 文件需要进行重定位的节。 重定位项保存在程序的重定位表中。这个表在 ELF 文件的数据段(.data 或 .rdata)中。对于 64 位的 ELF 文件,重定位项的类型是 RELA,包含了重定位节的偏移量、重定位的地址、重定位的类型和重定位的符号。对于 32 位的 ELF 文件,重定位项的类型是 REL,只包含了重定位节的偏移量和重定位的地址。重定位项类型中保存了一个数值,它指示了将要执行的操作和模式。 总之,重定位是 ELF 文件中一个重要的概念。它们允许程序动态地调整其代码和数据在内存中的位置,以便在任何地址空间中执行。重定位项和重定位表则是实现这个过程的工具和手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值