我有同样的问题。正如另一个答案中所建议的那样, pstruct 可能会有所帮助。但是,它确实提供了我们需要的东西。实际上 pstruct 使用 gcc 提供的调试信息。我基于相同的想法编写了另一个脚本。
您必须生成带有 STUBS 调试信息的程序集文件 ( -gstubs
)。(可以从 dwarf 获得相同的信息,但我使用的方法与 pstruct 相同)。在不修改编译过程的情况下执行此操作的一个好方法是添加"-gstubs -save-temps=obj"
到您的编译选项中。
以下脚本读取汇编文件并检测何时在结构中添加了额外的字节:
#!/usr/bin/perl -n
if (/.stabs[\t ]*"([^:]*):T[()0-9,]*=s([0-9]*)(.*),128,0,0,0/) {
my $struct_name = $1;
my $struct_size = $2;
my $desc = $3;
# Remove unused information from input
$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";
}
# Skip static members
if ($offset != 0 || $size != 0) {
($prev_name, $prev_offset, $prev_size) = ($name, $offset, $size);
}
}
}
调用它的好方法:
find . -name *.s | xargs ./detectPaddedStructs.pl | sort | un