【问题标题】:Type defines with gnu gcc compiler使用 gnu gcc 编译器定义类型
【发布时间】:2023-03-23 21:35:01
【问题描述】:

我用 gnu arm-elf-gcc 编译了一些类型定义,标志设置为 -02 -g。在我使用 objdump 制作了一个 .lst 文件后,按照命令行选项设置 -s -S -D。

我在列表中找不到类型定义。不在 .text 或 .data 部分?

unsigned int state_0=0x6;
typedef unsigned char uc32;

typedef struct{
     unsigned int mask;
     uc32 id;
     uc32 type;
     unsigned int attribute;
} Pin;

unsigned int state=2;

void foo(void)
{
    state=0;
    state=1;
}

void foo_1(void)
{
   Pin pin_1;

   uc32 loop=4;
   foo();
   pin_1.mask=0x5;
   state=0x07;
}

【问题讨论】:

  • 编译时定义不会进入可执行映像中的部分它们不会“变成”代码或数据!!!
  • 但字、半字、字节变量是在数据部分设置的。并且类型定义仅由编译器使用?如果我在代码中使用 typedefine 变量,不应该分配一些内存吗?
  • 您在堆栈上分配 Pin,因此您不会在任何部分看到它 - 您只会在 .text 中将其视为“代码”。

标签: c gcc embedded arm


【解决方案1】:

typedef 为现有类型创建别名 - 不再;编译器会将其解析为实际类型并相应地生成代码,类型名称符号不需要出现在最终代码或调试信息中。

此外,类型定义不实例化数据对象,它没有位置,因此不会出现在链接映射中。

【讨论】:

  • 所有结构、联合、枚举类型都是这样吗?即使它们没有类型定义。
  • @JoVanMontfort :类型名称通常不是对象,因此不在链接地图中 - 它们没有位置。此信息很可能包含在调试信息中,因为调试器需要有关结构和枚举等的信息(但不一定是 typedef 别名),但编码方式是特定于工具链的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多