GNU ARM 的#pragma

Posted

技术标签:

【中文标题】GNU ARM 的#pragma【英文标题】:#pragma for GNU ARM 【发布时间】:2013-09-28 15:27:53 【问题描述】:

我想将整个 C 文件包含在输出部分中,

这是我正在尝试的示例代码:

#include<stdio.h>
#pragma arm section code = ".sec_ro"
int main(void)

printf("Hi\n");

#pragma arm section

我用过:

arm-none-linux-gnueabi-gcc -S hello.c

获取 .S 文件。

但 .S 文件中似乎没有 sec_ro 部分。

编辑/更新

附加 .s 文件内容:

.arch armv5te
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 18, 4
.file   "hello.c"
.section    .rodata
.align  2
.LC0:
    .ascii  "Hi\000"
    .text
    .align  2
    .global main
    .type   main, %function
main:
    .fnstart
.LFB0:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    stmfd   sp!, fp, lr
    .save fp, lr
    .setfp fp, sp, #4
    add fp, sp, #4
    ldr r0, .L2
    bl  puts
    mov r0, r3
    ldmfd   sp!, fp, pc

我想包含一个完整的 C 文件来创建一个输出部分,我正在使用 GNU ARM 工具链,我错过了什么吗?

【问题讨论】:

我认为您应该在部分名称中删除点 (.)。 @EitanT : 我试过了..还是不行 你能把你的.S文件的内容贴出来吗? @EitanT : 添加 .s 文件内容。 【参考方案1】:

'#pragma arm' 指令仅受 ARM 工具链(RVCT 或 DS-5)支持。对于 GCC,您需要使用链接描述文件或 '_attribute(section)' 样式语法。 armcc 和 GCC 都支持这一点:

http://www.keil.com/support/man/docs/armccref/armccref_Cacbgief.htm

【讨论】:

所以这意味着,如果我们有一个大的 C 文件,假设有 100 个函数,如果我们需要将它放在整个部分,那么我们需要为每个部分放置这个“属性(部分)”功能? 是的,或者您可以使用链接描述文件。谷歌“链接器脚本 gnu LD”了解更多信息。 我正在使用链接描述文件,但首先这些部分应该由 gcc 生成,然后 ld 可以找到这些部分对吗? 您可以使用链接描述文件中目标文件的名称将其内容定向到特定部分。 math.utah.edu/docs/info/ld_3.html#SEC16【参考方案2】:

这是否说明如果使用 gcc,就无法通过类似 progma 的方式指定整个文件会话?

从源代码级别允许编程语法很重要,因为在许多情况下,链接器并不真正知道要包含哪些文件,尤其是在共享相同链接脚本的大型项目中。

【讨论】:

以上是关于GNU ARM 的#pragma的主要内容,如果未能解决你的问题,请参考以下文章

gnu 和 gnu-arm 编译器可以在同一个系统上共存吗?

GNU ARM 汇编指令

aarch64-linux-gnu-g++ 交叉编译为 arm64 错误

GNU ARM汇编语法

简单翻译和补充:1. GNU ARM Eclipse

GNU ARM 的#pragma