2

Bash を使用して、ac プログラム変数のアドレスを取得します。アドレスが整数、浮動小数点数、または倍精度変数に関連しているかどうかを知る方法は?

4

1 に答える 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などのバイナリ ダンプ ユーティリティを使用して、指定されたオブジェクトのサイズを取得するのが最善の方法です。nmobjdumpreadelf

使用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 に答える