3

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

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

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

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

4

3 に答える 3

2

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

pahole(別名「poke-a-hole」、dev-util/dwarvesGentooのようにパッケージ化)は、オブジェクトのDWARFデバッグ情報を読み取り、構造内の「穴」に関する情報を出力します。これは、開始点として適している場合があります。

于 2009-09-14T01:27:50.947 に答える
1

6.47オフセット

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 ++では、タイプは依存する場合があります。いずれの場合も、メンバーは単一の識別子、または一連のメンバーアクセスと配列参照で構成されます。

于 2009-09-12T18:19:38.740 に答える
0

arm-eabi-gdbで別の解決策を見つけました-print&init_taskとprint&init_task.pidを実行できますが、違いはオフセットです。

于 2009-09-13T12:37:09.257 に答える