clang 编译器结构打包 - 始终填充到 2 字节

问题描述 投票:0回答:1

clang 编译器结构打包 - 始终填充到 2 字节

Short:我无法让我的 clang 编译器将 lwip 中的

packed_struct_test
测试结构打包为 5 个字节。它总是显示 6 字节。

详情: 这是我的测试代码(

lwip/src/core/init.c
的开始部分),我注释掉了原始的lwip定义,以确保它被编译,这是我所需要的。

#ifndef LWIP_SKIP_PACKING_CHECK

#ifdef PACK_STRUCT_USE_INCLUDES
//#  include "arch/bpstruct.h"
#endif
// PACK_STRUCT_BEGIN
// struct packed_struct_test {
//   PACK_STRUCT_FLD_8(u8_t  dummy1);
//   PACK_STRUCT_FIELD(u32_t dummy2);
// } PACK_STRUCT_STRUCT;
// PACK_STRUCT_END

struct __attribute__((packed)) packed_struct_test
{
  uint8_t dummy1;
  uint32_t dummy2;
};


#ifdef PACK_STRUCT_USE_INCLUDES
//#  include "arch/epstruct.h"
#endif
#define PACKED_STRUCT_TEST_EXPECTED_SIZE 5

#endif

包装检查在这里完成:

#ifndef LWIP_SKIP_PACKING_CHECK
  volatile int temp = sizeof(struct packed_struct_test);
  LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", temp == PACKED_STRUCT_TEST_EXPECTED_SIZE);
#endif

使用调试器我看到 temp 是 6 个字节长。如果我删除

__attribute__((packed))
,则为 8。

我尝试了以下方法:

  • 将打包属性移动到定义中的不同位置(例如here
  • 使用
    #pragma pack(1)
    (例如此处
  • 使用带有 typedef 的属性
  • 使用对齐属性(例如here
  • 使用编译器参数
    -fpack-struct=1
  • 尝试使用
    -O0
  • 进行编译

我的编译器参数看起来像这样(删除了秘密内容):

C:/.conan/3535fc1/1/toolchains/tricore/v9.0.0/bin/clang.exe
-g
-Og
-march=tc162
-fno-common
-ffunction-sections
-fdata-sections
-Wall
-save-temps=obj
-MP
-Wno-parentheses-equality

-I...

-std=c99
-MMD

../....../init.c

-c
-o build-debug/....../init.o

版本:

  • lwip 2.1.2
  • 编译器 hightec tricore 编译器 9.0.0(clang 编译器)

这是一个最小的可重现示例:

测试.c

struct __attribute__((packed)) packed_struct_test
{
  unsigned int dummy2;
  unsigned char dummy1;
};

int main() {
    volatile int temp = sizeof(struct packed_struct_test);
    return 0;
}

构建它

clang.exe -g -O1 -march=tc162 -Wall -fpack-struct=1 -save-temps=obj -MP -std=c99 -MMD test.c -c -o test.o

然后在

mov %d15, 6
行的tests.s中可以看到,结构体大小是6:

.Ltmp0:
    .loc    1 9 5 prologue_end              # test.c:9:5
    mov %d2, 0
    .loc    1 8 18                          # test.c:8:18
    mov %d15, 6
    st.w    [%a10], 4, %d15
    .loc    1 9 5                           # test.c:9:5
    ret
.Ltmp1:
attributes clang pragma packing lwip
1个回答
0
投票

收到Hightec支持的回复:

您可以使用

attribute packed
pragma pack (1)
并且结构内部字段不会对齐。 打包结构只有一个限制,即整体结构大小将对齐为 2。

似乎编译器故意这样做。

© www.soinside.com 2019 - 2024. All rights reserved.