【问题标题】:How to set default struct alignment value as compilation parameter (GCC)如何将默认结构对齐值设置为编译参数(GCC)
【发布时间】:2021-06-09 14:18:40
【问题描述】:

我目前正在研究一个分为两部分的 Linux x64 gcc 项目:

  • 名为 myLib.a 的库
  • 一个名为 model.so 的模型链接了之前的库

这两部分不是同时编译的,也不是在同一个环境中编译的(我无法控制 model.so 编译指令)。 由于指针,两者都使用在某些标头中定义的结构共享实例

我的问题是相同的结构定义,比方说

typedef struct {
    char var1;
    int var2;
} myStruct;

将被隐式编译

#pragma pack(16)

在“模型”环境中,而在“myLib”中它是用隐式编译的

#pragma pack(4)

那么 struct 字段 myStruct.var2 可能不会指向 "myLib" 和 "model" 中的相同内存地址

我不知道如何告诉编译器在每个结构上使用 16 字节对齐(并避免在我的代码中显式编写它)

“myLib”的编译命令如下所示:

g++  -D __x86_64__ -Wall -fpic  -c ./libcode.cpp -o ./obj/Release_x64/libcode.o
ar -r -s ./bin/Release_x64/myLib.a ./obj/Release_x64/libcode.o

感谢您的帮助

【问题讨论】:

  • 当小结构成员跟随大结构时,可以达到更好的结构布局。你在找stackoverflow.com/questions/14179748/…
  • 好吧,我的问题更侧重于如何定义默认对齐值,以便确定编译器在到达没有“#pragma pack”或“属性的结构时会做什么 ((aligned))" 指令
  • 这在链接的问题中有所描述。
  • 嗯,我非常认真地阅读了整篇文章,我只看到定义了这些属性的情况。我的问题是“我的代码不能包含 #pragma pack 或 attribute,我可以使用编译器标志设置默认对齐行为”。也许答案是否定的

标签: c++ gcc 64-bit pack


【解决方案1】:

查看我在cmetshttps://stackoverflow.com/a/40043130/6752050发的问题的答案

在“myLib”头文件中:

#pragma pack(push, 4)
typedef struct {
    char var1;
    int var2;
} myStruct;
#pragma pack(pop)  // disables the effect of #pragma pack from now on

或

typedef struct {
    char var1 __attribute__((packed,aligned(4)));
    int var2 __attribute__((packed,aligned(4)));
} myStruct;

这适用于#pragma pack(4) 到myStruct,而不管“模块”中使用的#pragma pack(16)。

【讨论】:

  • 感谢您的回答,我已经应用了您的建议,因为我需要快速交付补丁。我的意思是知道我是否可以不更改源代码(在编译级别)。我很难理解为什么同一个编译器不会以同样的方式打包东西。我虽然默认情况下 x64 应用程序的结构打包将是 16 个块。但它似乎没有那么简单
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2017-02-14
相关资源
最近更新 更多