環境は 32 ビット SPARC 上の Solaris ですが、これは動的リンクや位置に依存しないコードに関するより一般的な問題だと思います。
位置に依存しないコードとしてコンパイルし、C プログラムから動的にリンクするアセンブリ プログラムがあります。アセンブリプログラムからアセンブリプログラムによって予約されたメモリを参照できないことを除いて、正常に動作します。アセンブリ プログラム内でのジャンプは正常に機能します。
アセンブリ プログラム内でメモリを読み書きしたいだけですが、試行するたびにセグメンテーション エラーが発生します。
この問題をデバッグするためにこのテスト プログラムを作成しました
.section ".data"
.global foo
foo: .word 1
.section ".text"
.global testprog
testprog:
save %sp, -(92+4), %sp
sethi %hi(foo), %o0 ! set foo, %o0
or %o0, %lo(foo), %o0
call print_int
nop
ret
restore
これをにコンパイルします
-K PIC -b として
結果の.soをCでdlopenします
dlhandle = dlopen(obj_file, RTLD_NOW)
dl_testprog = dlsym(dlhandle, "testprog")
を呼び出すとdl_testprog()
、「4」が出力されます。testprog または print_int のアドレスを出力しようとすると、"4" も出力されます。ラベルにジャンプすると、他のすべてが正常に機能します。逆アセンブルを見ると、当然のように foo が 0x0 に置き換えられています。
_GLOBAL_OFFSET_TABLE_
アセンブリプログラム内で自分のメモリに書き込むことができるようにするには、何かを実行する必要がありますか? もしそうなら、どうすればいいですか?私が試したすべての結果がセグメンテーション違反であり、これを行うための非常に優れたガイドを見つけることができませんでした (これは、あなたがそれを行うべきではないと私に信じさせます.とにかく、これはリンカーの問題ではありませんか?) .