vmlinux ELFは、指定された構造体のメンバーのオフセットを検索します

StackOverflow https://stackoverflow.com/questions/1415745

  •  06-07-2019
  •  | 
  •  

質問

Linuxカーネルでは、使用される構造体のメンバー変数のオフセットを見つける必要があります。たとえば、タイプがtask_structのinit_taskの場合、そのpidとタスクのオフセットが必要です。

このために存在するのはvmlinuxのみです。オープンソースのカーネルコードを参照できますが、現在のビルドとは異なる場合があります。

ソースなしでオフセットを取得することは可能ですか?

編集:vmlinuxはARM向けであり、ターゲットデバイスでCコードを常に実行できるとは限りません。

役に立ちましたか?

解決

構造のサイズとレイアウトは、コンパイルされたオブジェクトファイルのデバッグ情報に存在します( -g でコンパイルし、 strip を使用しない場合)。

pahole (別名" poke-a-hole&quot ;、 dev-util / dwarvesとしてパッケージ化 (Gentoo)では、オブジェクトのDWARFデバッグ情報を読み取り、「穴」に関する情報を出力します。構造内-それはあなたにとって良い出発点かもしれません。

他のヒント

6.47 Offsetof

GCCはCとC ++の両方に、offsetofマクロを実装するための構文拡張を実装しています。

 primary:
         "__builtin_offsetof" "(" typename "," offsetof_member_designator ")"

 offsetof_member_designator:
           identifier
         | offsetof_member_designator "." identifier
         | offsetof_member_designator "[" expr "]"

この拡張機能で十分です

 #define offsetof(type, member)  __builtin_offsetof (type, member)

は、offsetofマクロの適切な定義です。 C ++では、型は依存する場合があります。いずれの場合でも、メンバーは単一の識別子、または一連のメンバーアクセスと配列参照で構成されます。

arm-eabi-gdbを使用した別のソリューションが見つかりました-print& init_taskとprint& init_task.pidを実行できますが、違いはオフセットです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top