gpt4 book ai didi

c - 查看 C 结构在构建期间是如何打包的

转载 作者:太空狗 更新时间:2023-10-29 17:25:58 27 4
gpt4 key购买 nike

有什么方法可以查看 C 结构在构建期间是如何打包的吗?我已经阅读了几篇关于如何打包结构的类似帖子:

但我想知道是否有某种构建时生成的文件可以准确显示结构是如何打包的?我尝试检查链接器生成的映射文件,但它没有此信息。

PS:我正在尝试让一些微 Controller 通过 UART 相互通信,因为一个是 16 位而其他是 32 位,所以每次更新这些结构时我都会遇到一些错误。

最佳答案

预处理器无法计算出结构偏移量,因此仅靠宏魔法无法为您转储偏移量。

如果您正在构建嵌入式目标,您可能能够创建 .bin 文件(不是 elf、coff、mach-o)。如果您使用每个目标编译器在目标文件中创建偏移量数组,然后将其转储到 bin 文件,则应该可以比较每个目标的 bin 文件。将构建时间检查过程自动化是个好主意。

这是我正在谈论的例子:

#include <stdint.h>
#include <stddef.h>
typedef struct s1{
uint16_t f1;
uint32_t f2;
uint64_t f3;
int8_t f4[5];
uint32_t f5[2];
}s1;

#define o(f) ((int32_t)offsetof(s1,f))

int32_t offsets[]={
o(f1),
o(f2),
o(f3),
o(f4),
o(f5)
};

这只是创建了一个偏移量表。为 mipsel 和 x86_64 构建它并进行比较。这是一个生成文件:

T1:=x86_64-linux-gnu
CC1:=$(T1)-gcc
OBJCPY1:=$(T1)-objcopy
T2:=mipsel-linux
CC2:=$(T2)-gcc
OBJCPY2:=$(T2)-objcopy


.PHONY: all cmp clean hexdumps

all: hexdumps

hexdumps: hexdump.$(T1).txt hexdump.$(T2).txt

hexdump.$(T1).txt: offsets.$(T1).bin
hexdump -C $< > $@

hexdump.$(T2).txt: offsets.$(T2).bin
hexdump -C $< > $@

offsets.$(T1).bin: offsets.$(T1).o
$(OBJCPY1) -j.data -O binary $< $@

offsets.$(T2).bin: offsets.$(T2).o
$(OBJCPY2) -j .data -O binary $< $@

offsets.$(T1).o: offsets.c
$(CC1) -Wall -c -o $@ $<

offsets.$(T2).o: offsets.c
$(CC2) -Wall -c -o $@ $<

clean:
-rm -f offsets.$(T1).o offsets.$(T2).o
-rm -f offsets.$(T1).bin offsets.$(T2).bin
-rm -f hexdump.$(T1).txt hexdump.$(T2).txt

现在,比较偏移量非常简单:

evaitl@evbb ~/se $ cat hexdump.mipsel-linux.txt 
00000000 00 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00 |................|
00000010 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020
evaitl@evbb ~/se $ cat hexdump.x86_64-linux-gnu.txt
00000000 00 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00 |................|
00000010 18 00 00 00 |....|
00000014

mips 发出一个 32 字节的数据部分,而不是 x86 的 20 字节。如果您设置了 offsets 的大小,您应该能够使用 cmp 来比较您构建中的两者。

如果您的目标有不同的字节序,您可能需要更改 o 宏以使用 ntohl 或其他类似的东西来让两个编译器以相同的格式发出整数。

关于c - 查看 C 结构在构建期间是如何打包的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37717056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com