Bash を使用して、ac プログラム変数のアドレスを取得します。アドレスが整数、浮動小数点数、または倍精度変数に関連しているかどうかを知る方法は?
1 に答える
1
コメントで述べたように、デバッグ シンボルがない限り、型を取得できません。ただし、シンボルがある場合は、GDB を使用できます。このプログラムを考えてみましょう:
#include <stdio.h>
static int i = 42;
static float f = 42.1;
static double d = 42.2;
int main (int argc, char **argv) {
printf("i=%d, f=%f, d=%f\n", i, f, d);
return (0);
}
次のようにコンパイルすると:
gcc -g -o types types.c
次に、次のように変数の型を取得できます。
ubuntu@ubuntu:~$ echo ptype i | gdb --サイレント タイプ /home/ubuntu/types からシンボルを読み取り中...完了。 (gdb) タイプ = int ubuntu@ubuntu:~$ エコー ptype f | gdb --サイレント タイプ /home/ubuntu/types からシンボルを読み取り中...完了。 (gdb) タイプ = フロート ubuntu@ubuntu:~$ エコー ptype d | gdb --サイレント タイプ /home/ubuntu/types からシンボルを読み取り中...完了。 (gdb) タイプ = ダブル ubuntu@ubuntu:~$
シンボル テーブルしかなく、完全なデバッグ情報がない場合、つまりバイナリが でコンパイルされ-g
、 で処理された場合、やstrip -d
などのバイナリ ダンプ ユーティリティを使用して、指定されたオブジェクトのサイズを取得するのが最善の方法です。nm
objdump
readelf
使用nm
:
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' i$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
4
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' f$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
4
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' d$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
8
ubuntu@ubuntu:~$
これは次のように機能します。
nm -n
アドレスを番号順に並べた記号テーブルをリストしますgrep -A1 ' i$
関心のあるシンボルを、すぐ次の行で長くフィルタリングします。これは、シンボルi
を正確に検索するために構築された正規表現検索であり、他には何もないことに注意してください。cut -d' ' -f1
アドレスだけをリストしますread addr next_addr
アドレスを 2 つの変数に入れます- パイプされた式
bc
は、関心のあるアドレスとその直後のアドレスとの差を計算します。bc
アドレスは 16 進数であるため、パラメーターでそれを伝える必要があることに注意してibase
ください。また、${var^^}
bash 拡張は、必要に応じて 16 進数 af を大文字に変換しますbc
。
于 2013-11-04T17:53:45.693 に答える