吴忠躺衫网络科技有限公司

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

    文章

    9165

    瀏覽量

    369189
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49284
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33040
  • 匯編代碼
    +關注

    關注

    0

    文章

    24

    瀏覽量

    7567

原文標題:基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12 后續1 - 匯編代碼處理問題

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    四個方面全面解析Linux 下 C++ 編譯&鏈接

    【導讀】:編譯鏈接對CC++程序員既熟悉又陌生,熟悉在于每份代碼都要經歷編譯鏈接過程,陌生在于大部分人并不會刻意關注
    的頭像 發表于 08-27 09:36 ?5503次閱讀
    四個方面全面解析Linux 下 C++ <b class='flag-5'>編譯</b>&amp;<b class='flag-5'>鏈接</b>

    C語言的編譯鏈接過程

    ? C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼轉換成可以在硬件上運行的程序(可執行代碼),需要進行編譯
    的頭像 發表于 08-21 10:06 ?2709次閱讀
    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

    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.6w次閱讀
    了解“預<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 ?2200次閱讀

    編譯鏈接的套路有哪些?

    令參數: ? g++-c file 編譯源文件,但是不進行鏈接-o file 指定輸出文件的名字-s strip,移除符號信息-L dir 指令搜索鏈接庫的路徑-l lib 指定要鏈接
    的頭像 發表于 02-10 10:06 ?1540次閱讀
    <b class='flag-5'>編譯</b><b class='flag-5'>鏈接</b>的套路有哪些?

    as命令:用于將匯編代碼編譯為二進制代碼

    ? 1.命令簡介 as 命令是二進制工具集 GNU Binutils 的一員,是 GNU 推出的一款匯編語言編譯器集,用于將匯編代碼編譯為二
    的頭像 發表于 02-02 14:03 ?4249次閱讀
    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 ?3018次閱讀
    娱乐城注册送28| 百家乐返点| 专业百家乐官网分析| 南宁百家乐官网赌机| 大发888娱乐城新澳博| 百家乐官网技巧之微笑心法| 全讯网一码353788| 24山方向上| 百家乐官网庄闲点数| 全讯网高手| 百家乐天天赢钱| 来博百家乐官网现金网| 宁波水果机遥控器| 做生意挂什么画招财| 百家乐官网赢得秘诀| 老虎机定位器| 百家乐10法则| 百家乐官网平注法口诀| 大发888开户注册哪家好| 百家乐台布21点| 作弊百家乐官网赌具| 大丰收娱乐城开户| 百家乐龙虎玩| 中国百家乐官网的玩法技巧和规则| 澳门赌场筹码| 瑞士百家乐的玩法技巧和规则 | 百家乐官网策略大全| 永胜博| 678百家乐博彩娱乐平台| 悍马百家乐官网的玩法技巧和规则 | 菲律宾太阳城88| 加州百家乐娱乐城| 澳门百家乐官网职业| 真人轮盘游戏| 威尼斯人娱乐城官网地址| 真钱百家乐赌博| 百家乐官网平注常赢打法| 网上现金棋牌| 大发888我发财官网| 太阳城百家乐娱乐官方网| 网上百家乐官网游戏下载|