0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

armasm编译汇编代码链接失败的问题分析

嵌入式那些事 来源:嵌入式那些事 2023-11-13 16:03 次阅读

为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。

在公众号中回复"arm编译器升级文档"可以获取AC5升级到AC6.12的ARM官方文档。

1、armasm编译汇编代码,链接失败的问题

这里新开一篇博文,专门讲讲针对ARM格式的汇编代码,使用AC6.12应该如何处理。下述内容大多来自文档《migration_and_compatibility_guide_100068_0612_00_en.pdf》文档的 3.3 Command-line options for preprocessing assembly source code。

我在我自己的工程中遇到过使用AC6.12编译汇编代码成功,但是链接会失败。提示内容大致是:xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.对于这个问题,我起初以为是分散加载文件(*.scf)有问题,看了半天的分散加载文件内容,也没发现分散加载文件有问题。于是我转换方向,使用命令去手动编译startup_LPC55S69_cm33_core0.s,然后再手动链接,发现还是提示xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.错误。

于是我再次查阅ARM官方的升级与适配手册《migration_and_compatibility_guide_100068_0612_00_en.pdf》,发现armasm使用--cpreproc和--cpreproc_opts选项编译汇编代码时,输入源代码的后缀名是.S(大写)。然而我的工程的ARM格式的汇编代码文件的后缀名均为小写,导致了armasm处理出错。下面是文档中3.3 Command-line options for preprocessing assembly source code对--cpreproc和--cpreproc_opts的描述:

If you are using armasm to assemble source code that requires the use of the preprocessor, you must use both the --cpreproc and --cpreproc_opts options together. Also:
• As a minimum, you must include the armclang options --target and either -mcpu or -march in --cpreproc_opts.
• The input assembly source must have an upper-case extension .S.

其中第2点,对汇编源文件后缀名为大写.S作了一个说明吧。

为了处理汇编源文件后缀是小写.s的情况,文档的下面也提供了一个操作的说明吧:

If you have existing source files, which require preprocessing,and that have the lower-case extension .s, then to avoidhaving to rename the files:
1.Perform the preprocessing step separately using thearmclang -x assembler-with-cpp option.
2.Assemble the preprocessed file without usingthe --cpreproc and --cpreproc_opts options.

上面这段英文的内容给出了汇编源代码文件后缀是小写.s,但是又不想修改源代码后缀的方法,首先使用armclang (带编译选项-x assembler-with-cpp)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项--cpreproc和--cpreproc_opts)去编译这个过程*.s文件。这里提供一个例子如下:

(1).armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s;

(2).armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s;

2、总结

ARM Compiler 6.12对于ARM格式的汇编处理,这里总结下吧,分两种情况:

(1).如果ARM格式汇编代码源文件的后缀名是大写的.S,那么直接使用armasm 带编译选项--cpreproc和--cpreproc_opts进行编译即可,例如:

armasm --cpu=cortex-m33 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortex-m33 startup_LPC55S69_cm33_core0.S

(2).如果ARM格式汇编代码源文件的后缀名是小写的.s,这里就需要特殊处理了,有两种方法:

a.将ARM格式汇编代码源文件的后缀名改为大写.S,然后按照步骤(1)进行处理即可。

b.首先使用armclang (带编译选项-x assembler-with-cpp)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项--cpreproc和--cpreproc_opts)去编译这个过程*.s文件。这里提供一个例子如下:

1).armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s

2).armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361832
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397
  • 汇编代码
    +关注

    关注

    0

    文章

    23

    浏览量

    7512

原文标题:基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12 后续1 - 汇编代码处理问题

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    四个方面全面解析Linux 下 C++ 编译&链接

    【导读】:编译链接对CC++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译链接过程,陌生在于大部分人并不会刻意关注
    的头像 发表于 08-27 09:36 5230次阅读
    四个方面全面解析Linux 下 C++ <b class='flag-5'>编译</b>&amp;<b class='flag-5'>链接</b>

    C语言的编译链接过程

      C语言的编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行编译
    的头像 发表于 08-21 10:06 1617次阅读
    C语言的<b class='flag-5'>编译</b><b class='flag-5'>链接</b>过程

    汇编从零开始-2.4 源代码编译链接 #汇编 #硬声创作季

    编程语言汇编语言汇编代码代码编译
    fly
    发布于 :2022年08月26日 20:13:37

    ARM汇编学习

    .ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令. 目前常用的ARM编译环境有2种:ARMASM: ARM公司的IDE中使用了Co
    发表于 11-24 10:52

    单片机汇编代码分析

    、ARM、Cortex-M3系列。(其它系列单片机暂时无法分析,若有需求,需要另外专门评估).下述MSP430型号单片机程序均可以进行反汇编、反编译,都能进行HEX(TXT)二进制代码
    发表于 07-13 06:51

    ARM编译器6.6版ARMASM用户指南

    2.1 关于Arm Conventinger 工具链装配器,Armá 编译器工具链提供不同的装配器。 它们是: • 独立遗留的装配器, 编组器。 使用 armasm 来组装现有的 A64、 A32
    发表于 08-25 07:35

    汇编语言源代码分析

    汇编语言源代码分析 查看源代码将发现它由4 4个文件组成,其中:• 两个是汇编语言文件,它们的名字带后缀“ . s”;R
    发表于 02-09 16:18 26次下载

    RealView编译工具指南

    本手册提供有关 RealView 编译工具 汇编器(ARM 汇编器)的指导和参考信息。 其中包括 armasm、独立的汇编器以及 C 和 C
    发表于 04-26 16:00 43次下载

    DSP编程技巧之链接汇编代码与C_C++代码

    在DSP的开发中,常用的算法都可以用C/C++代码来高效实现。但是对一些特殊寄存器的读写,例如某些CPU寄存器的读写,因为C/C++代码无法直接对其访问,仍然需要使用汇编代码进行操作。
    发表于 10-18 09:47 7次下载
    DSP编程技巧之<b class='flag-5'>链接</b><b class='flag-5'>汇编</b><b class='flag-5'>代码</b>与C_C++<b class='flag-5'>代码</b>

    ARM汇编编译器的使用

    10.4 ARM汇编编译器的使用 armasm是ARM汇编语言的交叉编译器,本节将详细介绍它的使用方法。
    发表于 10-19 10:14 5次下载

    了解“预编译编译汇编链接”这四个过程对你有很大帮助

    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译
    的头像 发表于 04-18 10:08 3.5w次阅读
    了解“预<b class='flag-5'>编译</b>、<b class='flag-5'>编译</b>、<b class='flag-5'>汇编</b>、<b class='flag-5'>链接</b>”这四个过程对你有很大帮助

    ARM代码编译链接的工作流程

    ARM处理器在市面上到处都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的种类繁多,今天我们就来了解一下ARM代码编译链接的工作流程,以及过程中需要的相关概念信息
    的头像 发表于 12-22 16:57 1903次阅读

    as命令:用于将汇编代码编译为二进制代码

      1.命令简介 as 命令是二进制工具集 GNU Binutils 的一员,是 GNU 推出的一款汇编语言编译器集,用于将汇编代码编译为二
    的头像 发表于 02-02 14:03 3638次阅读
    as命令:用于将<b class='flag-5'>汇编</b><b class='flag-5'>代码</b><b class='flag-5'>编译</b>为二进制<b class='flag-5'>代码</b>

    ARM代码编译链接调试的工作流程梳理

    梳理下ARM代码编译链接的工作流程,以及过程中需要的相关概念信息,不具体关注编译链接的具体命令。
    发表于 02-09 10:03 1次下载
    ARM<b class='flag-5'>代码</b><b class='flag-5'>编译</b>与<b class='flag-5'>链接</b>调试的工作流程梳理

    怎么快速把汇编代码和C语言代码对应起来呢?

    分析软件缺陷,有时候需要把ELF文件反汇编汇编代码,然后分析汇编
    的头像 发表于 06-12 16:45 1764次阅读