問題タブ [relocation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hyperlink - リンク(GNU ld)再配置プロセスにおけるR_386_PC32とR_X86_64_PC32の違いは何ですか?
「コンピュータ システム: プログラマの視点」セクション 7.7.1 再配置エントリを読むとき: このセクションの簡単な内容は、リンカが別のオブジェクト ファイルで参照を再配置する方法です。
サンプル ソース コードをコンパイルして objdump すると、次のようになります。
次に、gcc -Wall -c -o main.o main.c、および objdump -S -r main.o > main.asm; スワップの再配置エントリが表示されます。
したがって、ld が main.o と swap.o をリンクするとき、ld は swap(offset=7, type=R_386_PC32) の再配置エントリ r を使用して、リンク アドレスを決定します。
また、call 命令のオペランド (fc ff ff ff) -4 は、386 命令セットに完全に適合しています。
しかし、X86_64 Linux でこれを繰り返すと、呼び出しのコードは次のようになります。
次に、私の質問は、386 の call(e8) のオペランドが -4((fc ff ff ff) であるのに、X86_64 の main.o のオペランドが 00 00 00 00 である理由です。異なる命令セット (call vs .callq)、または単に GNU ld が別のアルゴリズムを使用して R_X86_64_PC32 を再配置しますか?
あなたが答えてくれることを願っています、どうもありがとう。
solaris - Solaris 10 パッケージの Snoop - 再配置エラー
Solaris 10 ボックスで snoop を実行しようとしています。
Snoop はデフォルトではインストールされていなかったので、Solaris 10 CD から入手しました。私がインストールしたパッケージは SUNWrcmdc で、man snoop がこのパッケージに依存していることを示しています。
root として snoop を実行すると、次のエラーが表示されます。
ld.so.1: snoop: 致命的: 再配置エラー: ファイル /usr/sbin/snoop: シンボル dlpi_passive: 参照されたシンボルが見つかりません
ライブラリ パス エラーのように聞こえます。だから私はやった
host# ldd -r /usr/sbin/snoop
libdlpi.so.1 の最新パッチである Patch 145923-02 を入手して適用しました。役に立ちませんでした。同じ問題。
この「symbol not found: dlpi_passive」についてどうすればよいかわかりません。他に何を試すことができるかわかりません。
gcc - u-boot 再配置機能に関する質問
ターゲットでを使用してu-boot-2011.12
いOMAP3
ます。クロス ツール チェーンは ですCodeSourcery arm-none-linux-gnueabi
。コンパイルu-boot
し、ターゲットにダウンロードして起動しました。すべてうまくいきましたが、u-boot
再配置機能についていくつか質問があります。この機能がPIC
(位置に基づいていることはわかっています)独立コード)、-fpic
フラグをに設定することで位置独立コードが生成されますが、コンパイル フラグがgcc
見つかりません。fpic
PIC がなければ、u-boot はどのように再配置機能を実装できますか?
dynamic - .data.relセクション内の再配置可能シンボルと再配置不可能シンボルを区別する方法
ベアボーンARMアプリケーション用の単純なリンカーを作成しようとしています。.got
現在、モジュールをロードするローダーは、.data.rel
セクション内のすべてのレコードにオフセットを追加するだけです。これは、で正常に機能し.got
、内部で再配置が必要なすべてのシンボルに対して機能し.data.rel
ます。ただし、再配置不可能なすべてのデータについては、このオフセットも取得されるため、機能しなくなります。
例:
ここでa.fptr
は、関数の実際の場所を正しくアドレス指定しますが、だけでなく、a.number
を誤って保持します。0x1000 + offset
0x1000
2つをどのように区別する必要がありますか?.symtab
セクションを確認して、そこにあるアドレスのみを再配置するだけで十分ですか?しかし、シンボルが実際にその場所にある場合はどうなる0x1000
でしょうか。または、リンカはこの問題に対処しますか(したがって、アドレスに関数を配置しません0x1000
)?実際には、内部に.symtabs
あるすべての記号が含まれていますか?.got
.data.rel
c - シンボル テーブルに静的変数に関する情報を含める目的は何ですか?
.symtab
リロケータブル オブジェクト ファイルの setcion タイプを理解しようとしています。そして、静的変数に関する情報が含まれていることを知っています。しかし、なぜ?
再配置可能なオブジェクトファイルを他のファイルとリンクするために必要なのは、この静的変数のアドレスを再配置することだけです (もちろん、他のいくつかのファイルもそうですが、静的変数には関係ありません)。必要な.rel.data
のは、静的変数を再配置するためのすべての情報を格納して含む再配置テーブルだけです。
wordpress - 移行後、Wordpress が install-php にリダイレクトし続ける
これが私の状況です。サイトを別のサーバーに移動することについて、wordpress codex ページの正確な指示に従いました。これが私が取ったステップです。
- データベースのコピーをエクスポートする
- 新しいサーバーで新しいデータベースを作成する
- 先ほどエクスポートしたデータベースをインポートする
- Ftp 経由で自分の Wordpress ファイルのコピーをアップロードする
- このスクリプトを使用して、すべてのローカル URL を新しいものに変更します
- 新しいサーバーに合わせて wp-config.php ファイルを変更します (テーブルのプレフィックスを忘れていませんでした。大文字がいくつか含まれています)。
そして、新しい場所でサイトを開こうとすると、wp-admin/install.php に誘導されます。シナリオを明確にするために、(ライブサーバー上の) 宛先フォルダーは、public_html フォルダー内のサブディレクトリです。すでに別のワードプレスがインストールされています(問題が発生した場合に備えてこれを言っています)
私の .htaccess は次のようになります
phpMyadmin を使用してテーブルをチェックして修復しようとしましたが、すべて問題ないようで、問題には影響しません。
また、ライブサーバーのデータベースを空にして、インストールを実行してみました。そして、問題なくインストールされ、すべて正常に動作しますが、別のクリーン インストールは必要ありません。しかし、これは少なくとも wp-config ファイルの問題を除外すると思います. Wordpress バージョン 3.3.1 を使用しています
ですから、私が残した大きな疑問は次のとおりだと思います: 移行後にワードプレスが私のインストールを認識しないのはなぜですか?
どんな助けでも大歓迎です!
linux-kernel - 外部のクロスコンパイルされた SPARC Linux モジュールを挿入する際の再配置エラー
まず第一に、私は専門家ではないので、自分自身を説明しようとして間違いがあった場合はご容赦ください。
Sparc を使用して、SPARC マシン用の外部 Linux モジュールをクロスコンパイルしようとしていますLinux-GCC-4.4.2
。Linux カーネルのバージョンは2.6.36.4-00037-g059aa91-dirty
. LEON
プロセッサからのいくつかのファイルでパッチが適用されています。ビルド フローが提供されており、 、 、および が使用されてLinuxBuild
いBuildroot
ますBusybox
。32ビットOSを作ろうとしています。
すべてが機能しているように見えますが、モジュールをコンパイルして SPARC システムに insmod しようとすると、次のエラーが発生します。
このエラーは~/linuxbuild-1.0.3/linux/linux-2.6-git/arch/sparc/kernel/module.c
、完全を期すためにメソッド全体を提供します:
したがって、デフォルトのケースが私が該当するケースであることを理解しています。ELF_R_TYPE(rel[i].r_info
(SPARC Relocations) タイプは私の~/linuxbuild-1.0.3/dist/buildroot/build-br/staging/usr/include/elf.h
ファイルで定義されており、一部は次のとおりです。
したがって、再配置 6 はR_SPARC_DISP32
別名PC
相対 32 ビットに対応します。これはmodule.c
case ステートメントで定義されていますが、64 ビット セクションでのみ定義されています。再配置を自分で書くか、必要な再配置フラグを見つけて、コンパイル中にフラグを変更する必要があると思います。再配置コードで何が起こっているのかよくわかりません。これを修正する方法を教えてください。システムを壊すように見えるので、OS を 64 ビットとしてビルドすることはできないと思います。別の解決策を見つけるのを手伝ってください。
c++ - 共有オブジェクトに実装されている場合でも、共有オブジェクトの new&delete 演算子シンボルが再配置されるのはなぜですか?
以下のように、プログラムに独自の c++ new & delete 演算子を実装しようとしています。
次に、プログラムが次のように構築されている場合、- exe の場合、私の new/delete は期待どおりに呼び出されますが、共有オブジェクトの場合、new & delete のシンボルが再配置されることがわかりました。これが別のプログラムで dlopen によってロードされると、私の環境では、新しい & 削除が別のプログラムの新しい & 削除にマップされます...
詳細情報は以下の通りです...
exeを構築します:
gcc -m32 -c main.cpp gcc -m32 main.o -o main.exe
$ ./main.exe 私の新しいが呼び出されます! 私の削除が呼び出されます!
$ objdump -d main.exe 080484ac:
80484ac: 55 プッシュ %ebp
80484ad: 89 e5 mov %esp,%ebp
80484af: 53 プッシュ %ebx
80484b0: 83 ec 24 サブ $0x24,%esp
80484b3: 83 e4 f0 および $0xffffffff0 ,%esp
80484b6: b8 00 00 00 00 mov $0x0,%eax
80484bb: 83 c0 0f add $0xf,%eax
80484be: 83 c0 0f add $0xf,%eax
80484c1: c1 e8 04 shr $0x4,%eax
80484c4 : c1 e0 04 shl $0x4,%eax
80484c7: 29 c4 サブ %eax,%esp
80484c9: c7 04 24 04 00 00 00 movl $0x4,(%esp)
80484d0: e8 1f ff ff ff call 80483f4 <_Znwj> --> 新規: 期待!!
80484d5: 89 c3 mov %eax,%ebx
80484d7: 89 1c 24 mov %ebx,(%esp)
80484da: e8 35 00 00 00 call 8048514 <_ZN6ObjectC1Ev>
80484df: 89 5d f8 mov %ebx,-0x8(%ebp)
80484e2: 83 7d f8 00 cmpl $0x0,-0x8(%ebp)
80484e6: 74 22 je 804850a
80484e8: 8b 45 f8 mov -0x8(%ebp),%eax
80484eb: 89 45 e8 mov %eax,-0x18(% ebp)
80484ee: 83 7d e8 00 cmpl $0x0,-0x18(%ebp)
80484f2: 74 16 je 804850a
80484f4: 8b 45 e8 mov -0x18(%ebp),%eax
80484f7: 89 04 24 mov %eax,(%esp)
80484fa: e8 1b 00 00 00 コール 804851a <_ZN6Object
: 84D5 e8 mov -0x18(%ebp),%eax
8048502: 89 04 24 mov %eax,(%esp)
8048505: e8 0a ff ff ff call 8048414 <_ZdlPv> --> 削除: 予想共有オブジェクトを構築します。
gcc -m32 -c main.cpp gcc --shared -m32 main.o -o main.so
$ objdump -d main.so 000006d4 :
6d4: 55 プッシュ %ebp
6d5: 89 e5 mov %esp,%ebp
6d7: 53 プッシュ %ebx 6d8
: 83 ec 24 サブ $0x24,%esp
6db: 83 e4 f0 および $0xffffffff0 ,%esp
6de: b8 00 00 00 00 mov $0x0,%eax
6e3: 83 c0 0f add $0xf,%eax
6e6: 83 c0 0f add $0xf,%eax
6e9: c1 e8 04 shr $0x4,%eax
6ec : c1 e0 04 shl $0x4,%eax
6ef: 29 c4 sub %eax,%esp
6f1: c7 04 24 04 00 00 00 movl $0x4,(%esp)
6f8: e8 fc ff ff ff call 6f9 ---> 新規: 再配置される、予期しない :(
6fd: 89 c3 mov %eax,%ebx
6ff: 89 1c 24 mov %ebx,(%esp)
702: e8 fc ff ff ff call 703
707: 89 5d f8 mov %ebx,-0x8(%ebp)
70a: 83 7d f8 00 cmpl $0x0,-0x8(%ebp)
70e: 74 22 je 732
710: 8b 45 f8 mov -0x8(%ebp),%eax
713: 89 45 e8 mov %eax,-0x18(%ebp)
716: 83 7d e8 00 cmpl $0x0,-0x18(%ebp)
71a: 74 16 je 732
71c: 8b 45 e8 mov -0x18(%ebp),%eax
71f : 89 04 24 mov %eax,(%esp)
722: e8 fc ff ff ff 呼び出し 723 ---> 削除: 再配置される、予期しない :(
727: 8b 45 e8 mov -0x18(%ebp),%eax
72a: 89 04 24 mov %eax,(%esp)
72d: e8 fc ff ff ff コール 72e
arm - armlinkの同様のオプション「-BSymbolic」
再配置を減らすために、「-BSymbolic」をgccツールチェーンで使用できます。しかし、アームリンクはどうですか?同様のオプションはありますか?
linker - スタティック ライブラリの fPIC コード: なぜですか? 何が起こるのですか?
位置独立コードをスタティック ライブラリに配置するとどうなりますか? (特に、x86-64 では)
つまり、いくつかの.o
ファイルが PIC で生成され、.a
ファイルに配置されます。これ.a
は、通常どおり最終的な実行可能ファイルに静的にリンクされます。
動作しているように見えますが、これを行う意味はありますか? なんで?
最終的なアドレス計算は何をしますか? (リンク時? 実行時?)
ありがとうございました