我曾经遇到过同样的问题。正如另一个答案所建议的那样,pstruct可能会有所帮助。但是,它并没有给出我们需要的完全信息。实际上,pstruct使用了gcc提供的调试信息。我基于同样的想法编写了另一个脚本。
您必须使用STUBS调试信息(-gstubs
)生成汇编文件。(虽然可以从dwarf中获取相同的信息,但我使用了与pstruct相同的方法)。一种不修改编译过程的好方法是将"-gstubs -save-temps=obj"
添加到编译选项中。
下面的脚本读取汇编文件,并检测结构体中是否添加了额外的字节:
if (/.stabs[\t ]*"([^:]*):T[()0-9,]*=s([0-9]*)(.*),128,0,0,0/) {
my $struct_name = $1;
my $struct_size = $2;
my $desc = $3;
$desc =~ s/=ar\([0-9,]*\);[0-9]*;[-0-9]*;\([-0-9,]*\)//g;
$desc =~ s/=[a-zA-Z_0-9]+://g;
$desc =~ s/=[\*f]?\([0-9,]*\)//g;
$desc =~ s/:\([0-9,]*\)*//g;
my @members = split /;/, $desc;
my ($prev_size, $prev_offset, $prev_name) = (0, 0, "");
for $i (@members) {
my ($name, $offset, $size) = split /,/, $i;
my $correct_offset = $prev_offset + $prev_size;
if ($correct_offset < $offset) {
my $diff = ($offset - $correct_offset) / 8;
print "$struct_name.$name looks misplaced: $prev_offset + $prev_size = $correct_offset < $offset (diff = $diff bytes)\n";
}
if ($offset != 0 || $size != 0) {
($prev_name, $prev_offset, $prev_size) = ($name, $offset, $size);
}
}
}
调用它的好方法:
find . -name *.s | xargs ./detectPaddedStructs.pl | sort | un