vmlinux ELFは、指定された構造体のメンバーのオフセットを検索します
質問
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を実行できますが、違いはオフセットです。
所属していません StackOverflow