Error: unknown pseudo-op: `.arch_extension'

你好!这里是风筝的博客,

欢迎和我一起交流。


在编译u-boot时发现一个error:

arch/arm/cpu/armv7/nonsec_virt.S: Assembler messages:
arch/arm/cpu/armv7/nonsec_virt.S:15: Error: unknown pseudo-op: `.arch_extension'
arch/arm/cpu/armv7/nonsec_virt.S:16: Error: unknown pseudo-op: `.arch_extension'
scripts/Makefile.build:316: recipe for target 'arch/arm/cpu/armv7/nonsec_virt.o' failed

和

arch/arm/cpu/armv7/psci.S: Assembler messages:
arch/arm/cpu/armv7/psci.S:25: Error: unknown pseudo-op: `.arch_extension'
scripts/Makefile.build:316: recipe for target 'arch/arm/cpu/armv7/psci.o' failed
make[1]: *** [arch/arm/cpu/armv7/psci.o] Error 1

我去网上找了下解决办法,发现都是说:

编译器套件的版本不兼容。
通常在编译了一些版本不匹配的编译器之后,会有一系列的类似错误

简而言之就是要我换交叉编译工具,但是我嫌太麻烦了。找了好久,终于让我在Google上找到答案:
在nonsec_virt.S里的原内容是:

.arch_extension sec

修改为:

#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 6

".arch_extension sec\n"
#endif

即可。
也不算解决吧,就是个条件编译,感觉就是把他注释了而已……

<think>我们正在处理一个汇编错误:"unknownpseudo-op: '.syntax'"根据用户提供的引用[2]中,他们使用的是arm-linux-gcc进行汇编,而.syntax伪操作是ARM汇编中的一种指令,用于指定汇编语法(例如,是统一汇编语言UAL还是旧式汇编)。错误信息表明使用的汇编器不认识'.syntax'伪操作,这通常是因为汇编器版本较旧或者目标平台不支持。解决方案:1.检查汇编器版本:确保使用的arm-linux-gcc版本支持.syntax伪操作。较新的ARM汇编器通常支持。2.如果汇编器确实不支持,可以尝试移除或替换该伪操作。在ARM汇编中,.syntaxunified用于指定使用统一汇编语言(UAL),它允许使用相同的助记符同时支持ARM和Thumb指令集。如果汇编器不支持,可以考虑以下两种方法:方法一:升级工具链到支持.syntax的版本。方法二:修改汇编代码,移除.syntax行,并确保使用旧式语法编写代码。但需要注意,旧式语法可能在不同架构间有差异。另外,查看用户提供的引用[1]中,他们遇到了类似的问题('log2'未定义),通过修改头文件中的宏定义来解决。虽然问题不同,但思路类似:通过修改源代码来适应环境。因此,我们可以尝试在汇编文件中将.syntax行注释掉或删除,然后使用旧式语法编写剩余代码。但是,如果代码中使用了UAL特有的语法(如同时支持ARM和Thumb的指令格式),则可能需要调整指令写法。具体步骤:1.打开汇编文件(例如nLED1.S),找到包含.syntax unified的行,将其删除或注释掉(在行首加#或/**/)。2.检查代码中是否有使用UAL语法(例如,指令后面带有条件码和S标志,且这些标志在旧式语法中可能不允许),如有则需要修改为旧式语法。3.重新编译。注意:旧式语法中,ARM和Thumb指令的写法不同,而且条件执行可能只限于分支指令。如果代码中使用了条件执行的非分支指令(如addne,moveq等),这在旧式语法中也是支持的,所以可能不需要修改。示例:原代码:.syntax unified.global_start_start:movr0, #1修改后://注释掉.syntax unified.global _start_start:mov r0,#1如果这样修改后出现其他语法错误,则可能需要根据旧式语法调整指令。另外,用户引用[2]中的Makefile使用的是arm-linux-gcc,我们可以尝试使用更新的交叉编译工具链,比如从Linaro获取的较新版本。如果问题仍然存在,请提供出现错误的汇编代码片段,以便进一步分析。相关问题:1.如何查看当前使用的arm-linux-gcc版本?2. ARM汇编中的.syntax伪操作有什么作用?3.除了.syntax,还有哪些常见的ARM汇编伪操作?</think>### 解决汇编错误:unknown pseudo-op `.syntax' #### 问题分析 汇编器报错 `unknown pseudo-op: '.syntax'` 表示当前使用的汇编器不支持 `.syntax` 伪指令。该指令通常用于 **ARM架构** 的汇编代码中,用于指定汇编语法模式(如 `unified``divided`)。常见原因包括: 1. **工具链版本过旧**:旧版汇编器(如 `arm-linux-as`)可能不支持该指令。 2. **目标架构不匹配**:代码针对 ARMv7/ARMv8 编写,但工具链配置为早期架构(如 ARMv4/ARMv5)。 #### 解决方案 根据引用[2]中使用的工具链(`arm-linux-gcc`),提供以下方法: ##### 方法1:升级工具链(推荐) 更新至支持 UAL(Unified Assembly Language)的较新工具链: ```bash # 安装新版 ARM 交叉编译工具链(示例) sudo apt-get install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf ``` ##### 方法2:修改汇编代码 移除或替换 `.syntax` 伪指令: 1. **直接删除**(若代码未依赖 UAL 特性): ```armasm ; 注释或删除此行 ; .syntax unified ``` 2. **替换为兼容语法**(旧版汇编器): ```armasm .arch armv5te ; 指定兼容的旧版架构 .code 32 ; 明确使用 ARM 模式 ``` ##### 方法3:修改汇编器参数 在编译命令中添加架构标志(参考引用[2]的 Makefile): ```makefile all: arm-linux-gcc -c -march=armv7-a -o nLED1.o nLED1.S # 添加 -march 参数 arm-linux-ld -Ttext 0 nLED1.o -o nLED1.elf arm-linux-objcopy -O binary -S nLED1.elf nLED1.bin ``` #### 验证步骤 1. 检查工具链版本: ```bash arm-linux-gcc -v # 查看 GCC 版本 arm-linux-as --version # 查看汇编器版本 ``` 2. 确认汇编器支持的伪指令: ```bash arm-linux-as --help=directives | grep syntax ``` > **关键提示**:若使用旧版工具链(如三星 S3C2440 开发环境),优先选择 **方法2** 或 **方法3**。新版工具链(如 Raspberry Pi 开发)可直接升级[^1][^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值