4

共有ライブラリを32ビットから64ビットに移植しています。これは、いくつかのプロシージャと少し高レベルのCグルーコードをエクスポートするアセンブリ(NASM用に作成)で構成されています。NASM2.10.01とGNUld2.22を搭載した64ビットDebianマシンでビルドしています。

すべてのプッシュ/ポップの問題を修正しました(レジスタの32ビット部分のプッシュは64ビットモードでは明らかに機能しません)、オブジェクトをアセンブルしましたが、リンク段階で停止しました。これが私のコマンドラインです-アセンブリ:

nasm -Ox -dPTC_ARCH=X64 -f elf64 particl.asm -o particlasm.o

リンク:

ld -shared -lc -S -melf_x86_64 particlasm.o ptc_highlevel.o -o libparticlasm.so (-lcスイッチは標準Cライブラリのリンクを強制します-アセンブリコードにその関数のいくつかが必要です)

ただし、リンカは次のメッセージで失敗します。

ld: particlasm.o: relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
particlasm.o: could not read symbols: Bad value`

64ビットシステムでPICが必要な理由を知っています。NASMマニュアルのセクション9.2で説明されているように、私は実際にPICを使用しています。ただし、NASMがELFシンボルテーブルでコードをPICとしてマークしていないように見えます。これにより、リンカーが抗議し、これを修正するための関連するコマンドラインスイッチまたはディレクティブがマニュアルに見つかりません。

何か案は?

4

1 に答える 1

3

解決しました!私の場合、移転の結果は次のとおりです。

1)libc呼び出しに追加することで解決しwrt ..pltlibc呼び出し、たとえばcall rand wrt ..plt

2)コード内に配置された定数への参照。これはegpush MASK_RGBからに変更する必要がありました(特定のプラットフォームのネイティブワードタイプにエイリアスする自分のタイプはpush ptr [rel MASK_RGB]どこにありますか)。ptr

于 2012-08-21T19:41:37.933 に答える