6-6 调查 :在6.3.1节编写的程序favorite_languages.py中执行以下操作

此程序遍历一个人员字典,检查哪些人已参与调查并表示感谢,同时邀请未参与调查的人员。已参与的有'jen'和'phil',他们对调查作出了贡献。其他人如'sarah'和'edward'尚未参与,期待他们的参与。
  • 创建一个应该会接受调查的人员名单,其中有些人已包含在字典中,而其他人未包含在字典中。
  • 遍历这个人员名单,对于已参与调查的人,打印一条消息表示感谢。对于还未参与调查的人,打印一条消息邀请他参与调查。
​
dictionary = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
received_persons = ['jen', 'phil']
for name in dictionary.keys():
    if name in received_persons:
        print('Thank you!'+name.title())
    else:
        print('We invite you !'+name.title())

​

/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information. ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `gpiod_chip_open': core.c:(.text+0x60): undefined reference to `__lstat64_time64' core.c:(.text+0x82): undefined reference to `__stat64_time64' /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '256', this reader only handles version 2, 3 and 4 information. core.c:(.text+0x1c6): undefined reference to `__ioctl_time64' ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `gpiod_line_update': core.c:(.text+0x2ea): undefined reference to `__ioctl_time64' ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `line_request_values': core.c:(.text+0x504): undefined reference to `__ioctl_time64' /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information. ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `line_request_event_single': core.c:(.text+0x6e0): undefined reference to `__ioctl_time64' ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `gpiod_line_get_value_bulk': core.c:(.text+0x942): undefined reference to `__ioctl_time64' /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '55303', this reader only handles version 2, 3 and 4 information. ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o):core.c:(.text+0x968): more undefined references to `__ioctl_time64' follow /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '6656', this reader only handles version 2, 3 and 4 information. ./gpio/source/lib/libgpiod.a(libgpiod_la-core.o): In function `gpiod_line_event_wait_bulk': core.c:(.text+0xf30): undefined reference to `__ppoll64' /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information. ./gpio/source/lib/libgpiod.a(libgpiod_la-helpers.o): In function `gpiod_chip_open_lookup': helpers.c:(.text+0x178): undefined reference to `__isoc23_strtoul' collect2: 错误: ld 返回 1 make: *** [Makefile:63:build/bin/demo] 错误 1
最新发布
06-02
<think>好的,我现在需要解决用户遇到的编译问题,具体是Dwarf版本不兼容和链接时的未定义引用错误。用户提供的错误信息包括DWARF版本5不被支持,以及多个未定义的符号如__lstat64_time64、__stat64_time64等。我需要结合之前的回答和用户提供的引用内容来找到解决方案。首先,关于DWARF版本的问题。用户使用的工具链中的链接器(arm-linux-gnueabihf-ld)不支持DWARF5,而编译生成的调试信息是DWARF5。这可能是因为使用的编译器默认生成DWARF5,或者构建库时指定了DWARF5选项。根据引用[1]中提到,用户检查了binutils工具的支持情况,可能当前的binutils版本较低,不支持DWARF5。解决方法可能是强制生成DWARF4的调试信息,或者在工具链中升级支持DWARF5的binutils。接下来是未定义的符号问题。这些符号如__lstat64_time64、__stat64_time64等,属于时间相关的系统调用,通常与glibc的版本有关。用户使用的工具链可能是基于较旧的glibc版本(如低于2.32),而这些符号在较新版本中引入。如果目标系统的glibc版本较旧,或者交叉编译时链接的库不匹配,就会出现未定义引用。解决方案可能需要升级glibc,或者调整代码以使用旧版的时间函数,或者确保链接正确的库。另外,用户引用中提到ptrace是Linux的系统调用,这可能与调试相关,但当前问题可能不直接相关。引用[3]提到的跨平台编译问题可能涉及环境配置,但用户的问题集中在ARM交叉编译上,可能需要关注工具链和目标系统的兼容性。 综合之前的回答,我需要分步骤处理这两个问题。首先解决DWARF版本问题,通过编译选项指定DWARF4。然后处理未定义符号,可能需要检查glibc版本,添加链接库,或者调整代码。同时,检查工具链的兼容性,确保使用的binutils和glibc版本支持所需的符号和调试格式。可能需要验证工具链的版本,例如检查arm-linux-gnueabihf-gcc和ld的版本,确认是否支持所需的特性。如果工具链过旧,建议升级到更新的版本,如GCC10以上,或者使用官方提供的工具链,如Linaro的更新版本。此外,用户提供的错误中还提到了__isoc23_strtoul,这可能与C库函数strtoul的新版本有关,同样需要检查glibc的版本是否支持该函数。如果glibc版本过低,可能需要在编译时使用兼容性选项,或者修改代码使用旧版函数。最后,考虑用户可能的操作步骤,比如在Makefile中添加编译选项,调整链接库,或者更新工具链。需要给出具体的命令示例,如CFLAGS中添加-gdwarf-4,LDFLAGS中添加-lrt等,并建议用户检查工具链和库的版本。</think>### 分步解决方案 #### 1. **Dwarf版本5不兼容问题** 问题根源是工具链中的`binutils`版本过低,无法解析DWARF5调试信息。根据引用[1]中列出的`binutils-2.35.1`工具链组件,其默认支持的DWARF版本为4或更低[^1]。 **解决方案**: 1. **强制生成DWARF4调试信息** 在编译时添加`-gdwarf-4`选项: ```makefile CFLAGS += -gdwarf-4 ``` 2. **升级binutils工具链** 若目标系统支持,升级到`binutils >= 2.36`(支持DWARF5): ```bash # 示例:替换工具链路径 export PATH=/opt/new-toolchain/bin:$PATH ``` #### 2. **未定义符号问题分析** 未定义符号`__*_time64`和`__isoc23_strtoul`属于glibc的**时间64位扩展**和**C23标准库更新**特性,需验证工具链与目标系统的兼容性: - `__*_time64`:glibc >= 2.32 引入的64位时间系统调用[^2] - `__isoc23_strtoul`:C23标准函数,需glibc >= 2.36 **解决方案**: 1. **降级代码兼容性** 若目标系统glibc版本低,修改代码使用传统函数: ```c // 替换示例:使用stat()代替stat64_time64() struct stat st; stat(path, &st); // 替代__stat64_time64 ``` 2. **升级glibc版本** 在交叉编译环境中更新glibc: ```bash # 下载glibc源码并交叉编译 wget http://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz tar xzf glibc-2.38.tar.gz cd glibc-2.38 && mkdir build && cd build ../configure --host=arm-linux-gnueabihf --prefix=/opt/glibc-2.38 make && make install ``` 3. **链接兼容性库** 添加`-lrt`和`-lpthread`库解决时间函数依赖: ```makefile LDFLAGS += -lrt -lpthread ``` #### 3. **工具链验证** ```bash # 检查工具链版本 arm-linux-gnueabihf-gcc --version # 确认GCC >= 10.0 arm-linux-gnueabihf-ld --version # 确认binutils >= 2.36 # 检查目标系统glibc版本 strings /path/to/target/libc.so.6 | grep GLIBC_ ``` #### 4. **临时绕过方案** 若无法升级工具链: ```makefile # 禁用调试信息(不推荐) CFLAGS := $(filter-out -g, $(CFLAGS)) # 静态链接glibc(增大体积) LDFLAGS += -static ``` --- ### 验证示例 假设代码中使用了`stat64_time64`: ```c struct stat64 st; __stat64_time64("file.txt", &st); // 替换为stat() ``` 修改为: ```c struct stat st; stat("file.txt", &st); // 传统时间函数 ``` --- ### 总结步骤 1. **编译选项调整** ```makefile CFLAGS += -gdwarf-4 -D_USE_LIBC_TIME_LEGACY LDFLAGS += -lrt -lpthread ``` 2. **工具链升级** 使用支持DWARF5和glibc 2.38的工具链(如Linaro GCC 12) 3. **代码兼容性检查** 替换所有`*_time64`和C23标准函数 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值