問題タブ [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.
linux - CentOS5 ボックスでの Ubuntu 12.04 コンパイル済み C++ プログラムの実行
g++を使用してC++でLinux上で開発されたソフトウェアがたくさんあります。このコードは、Ubuntu 12.04 と CentOS 5 の両方でコンパイルおよび実行されます。まだ CentOS 5 を実行している古いサーバーがいくつかあります。現在、両方の OS 用にコンパイルしています。C++11 の機能を使い始めたいと思っています。これらは Ubuntu 12.04 ではサポートされていますが、CentOS 5 ではサポートされていません。
CentOS 用の Ubuntu で実行可能ファイルを作成しようとしています。その目的のために、すべての実行可能ファイルをリンクしました
-Wl、-rpath、/home/arcamax/lib
これにより、標準の場所の前に /home/arcamax/lib で共有ライブラリを探すように指示されます。次に、Ubuntu ボックスで「ldd」を使用して必要なライブラリのリストを作成し、それらのライブラリを CentOS ボックスの /home/arcamax/lib にコピーしました。CentOS ボックスでプログラムを実行しようとすると、次のようになります。
CentOS5 ボックスで ldd を実行すると、次のような出力が得られます。
/lib64/ld-linux-x86-64.so.2 という 1 つの lib があることに注意してください。これはまだシステムの場所からプルされています。なぜだかわかりません。プログラムを実行しようとすると、次のようになります。
再配置エラー: /home/arcamax/lib/libgnutls.so.26: シンボル時間、バージョン GLIBC_2.2.5 がファイル libc.so.6 で定義されていません (リンク時間参照あり)
一部のプログラムは、次のメッセージで ldd に失敗します。
動的実行可能ファイルではありません
これらのプログラムを実行しようとすると、他のプログラムと同じエラーが報告されます。
32bit-64bit - PIC コンパイル - エラー: 共有オブジェクトを作成する場合、'vtable for hit' に対する再配置 R_X86_64_32S は使用できません。-fPIC で再コンパイル
私は Linux の初心者で、32 ビット マシンで正常に動作するメイク ファイルのコンパイルに問題があります。私はこのプログラムを書きませんでしたが、その機能を使用するには動作する必要があります。私のマシンは 64 ビットですが、次のエラー メッセージが表示されます。
このWebサイトを使用して問題を解決しようとしていますが、プログラムが機能しません... http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml? part=1&chap=3 私はメイクファイルに慣れていないので、共有ライブラリを PIC コンパイルするためにメイクファイルを適切に変更することができません。フラグ「export CXXFLAGS=$CXXFLAGS -fPIC」をグローバルに追加しましたが、機能しませんでした。私は完全に迷っています。
make ファイルは次のとおりです (2 つの make ファイルとそれらを呼び出す 1 つ)。
----------------------------------------------2 -------- ------------
----------------------3-------------------------
誰かが私を助けてくれることを願っています。前もって感謝します!!ダニエル
c - GCC ですべてのシンボルを出力ファイルにエクスポートする方法
オペレーティング システムを開発していますが、ページングをセットアップする前にいくつかのモジュールをロードする必要があります。したがって、この時点ではページングが設定されていないため、プログラム内のすべてのシンボルを物理アドレスに再配置する必要があります。私の問題は、すべてのシンボルがシンボル テーブルにあるわけではなく、すべての再配置情報が rel.text にあるわけではないことです。GCCにすべてのシンボルデータをエクスポートさせるにはどうすればよいですか???
assembly - 移転の概念は何を意味しますか?
私はアセンブリが初めてなので、再配置の概念についてもっと理解したいと思っています。
- プログラムやデータを再配置する必要があるのはなぜですか?
- それはどのように正確に行われますか?
誰かが初心者レベルの例で説明できれば素晴らしいでしょう.
mips - GNU ld を使用して、「relocation truncated」エラーを発生させずに特定の (外部) シンボルのアドレスを強制するにはどうすればよいですか?
2 つの関数 と がa()
ありb()
、どちらも特定の固定ロード/ランタイムアドレスを持っています。私はa()
自分自身をコンパイルしb()
ていますが、既に提供されています (たとえば、ROM で)。
ファイルa.c
は次のとおりです。
これにより、次のアセンブリ コードが生成されます。
したがって、そこに 26 ビットの再配置を配置してb()
います (呼び出しのターゲットは、呼び出し命令自体のアドレスからの 26 ビットのオフセットです)。と の特定のアドレスがそれぞれ 0x80001000 と 0x80002000 であるとしますa
。b
それでいいはずです。b
簡単に手の届くところにありa
ます。
したがって、リンカー スクリプトには次のようなものがあります。
ただし、このスクリプトとリンクa.o
すると、次のエラーが発生します。
これはおそらく、リンカが完全な 32 ビット値 ( 0x80002000
) をジャンプ先の 26 ビット空間に収めようとしていることが原因です。リンカー スクリプトの何が問題になっていますか?
reverse-engineering - ELF 再配置のリバース エンジニアリング
再配置エントリと ELF セクション データがどのように関連しているか、およびそれらがすべてどのように処理および生成されるかを理解するのを手伝ってくれることを願っています。
ELF ファイルと関連する PLF ファイル (ビルド プロセスの初期段階で生成された部分的にリンクされたファイル) を取得し、そこからカスタムの再配置可能ファイルをビルドする、サポートされていない古いツールを使用しています。このファイルは、メモリの制約が厳しいプラットフォーム (PPC) で使用されます。これは、起動後にアンロードする初期化コードが大量に含まれていることを除けば、問題なく機能します。そのため、アンロードするためにすべての初期化コードをカスタム セクションに配置しましたが、残念ながら、ツールはカスタム セクションを適切に処理できず、rel ファイルは無効です。したがって、私の仕事は、カスタム セクションを含むこの再配置可能なファイルを正しく生成する新しいツールを作成することです。
私は、このツールと rel ファイルの生成については比較的長い道のりを歩んできましたが、現在、セクション データの処理方法や再配置エントリの作成方法などを理解しようとして行き詰まっています。したがって、このリバース エンジニアリング ビジネスはすべて私にとって初めてのことです (インターネットに感謝します!)。
Elf Sharpを見つけて、それを出発点として使用しました。ELF ファイルと PLF ファイルの両方を読み込んで、その内容を操作することができます。そこから、再配置ファイルのヘッダーと内容の大部分をリバース エンジニアリングしましたが、正確とはほど遠いものです。古いツールのバージョンのファイルと私のファイルを比較すると、一部のセクション データが修正されていることがわかりますが、私のファイルは PLF ファイルから直接セクション データを使用しており、プレーンです。つまり、コピーしたセクション データには大量の「48 00 00 01」が含まれていますが、これらはすべて古いツールによって何らかの方法で修正されています。それらのバイトの意味は何ですか? また、それらに対して何が行われていますか? また、再配置エントリを生成する必要がありますが、続行する方法がわかりません。
オンラインでエルフの再配置を処理する例をいくつか見つけました。ツールで同様のものを実行していますが、正確に何をすべきかはまだかなり不明です。私はすべての再配置タイプとそれらの公式 (4.12.5 章の章) の良いリソースを持っていますが、どのオフセット、セクション情報などを使用すべきかまだよくわかりません。
TL;DR
これらの再配置エントリで正確に何が起こっているか、すべてがどのように生成および処理され、プログラムの実行時にどのように使用されるかを視覚化するのを手伝ってもらえますか?
セクションデータの「48 00 00 01」という単語はすべてどうしたのでしょうか? それらは適切なシンボルで解決されたと思いますが、これはどのように行われたのですか? .rela 情報を使用していますか?
また、いつ PLF コンテンツを使用し、いつ ELF コンテンツを使用すればよいかわかりません。ロードアドレスとセグメント情報を取得するには ELF だけが必要だと思います。
(PPC で) 再配置フィックスアップを生成する場合、再配置タイプの式を正確に評価するにはどうすればよいですか? 私がオンラインで参照した例は、その点で直感的ではありません。私はオフセットと混同しています - あなたは Elf32_Rela から取得しますが、それはあなたが変更したものですか? そして、フィックスアップの結果を記録するために使用されるオフセットは何ですか? 加数とは正確には何ですか?私はこれほど啓発的なものをオンラインで見つけたことがありません。
再配置修正の一部 (実際にはほとんど) は、複数の .debug_ *セクションまたは .bss のいずれかを指しています。.debug の修正をスキップする必要がありますか、それとも重要ですか? .bss は NoBits セクションなので、どのように処理すればよいですか? そして、実際に再配置エントリを生成することになると、それらがどのように構築されるかは理解できますが、実際にエントリを作成する背後には誰/何がありますか? つまり、ビルドする準備はできていますが、どこから始めればよいかわかりません。データをどこかで繰り返しますか??
私が尋ねるべきであるが、まだ気づいていない他の質問はありますか? ;)
私の長々とした質問を読んでくれてありがとう!
svn - SVN の再配置後に SVN の更新が機能しない
最近、SVN リポジトリを SERVER1 から SERVER2 に移行しました。
- SERVER2にSVNをインストールしました。
svnrdump
ユーティリティを使用してリポジトリをダンプしました。- ユーティリティを使用
svndump load
して、ダンプ ファイルを新しい svn サーバーにロードしました。
SERVER1 svnのパスから作業コピーWCをチェックアウトしました。http://SERVER1/project1/data
ここで 1 つのことに注意してください。
- ダンプを取ったところ、SERVER1 の SVN リビジョンは 12345 でした。
- WCをチェックアウトしたとき、SVN リビジョンは 13456 でした。
今、 を使用してrelocate from tortoise svn on windows
、WCを SERVER2 svn から path に再配置しましhttp://SERVER2/project1/data
た。
引っ越し成功。
この後、check-in
rev-12345 から rev-13456 までに行われた変更を http://SERVER2/project1/data
.
しかし、ここで何が起こっているのですか:
- コミット操作では、コミットするファイルが表示されません。
- 変更を確認しても、変更は表示されません。
- SVN Update にエラー 'No such Revision: 13456' が表示される。
- WCと
http://SERVER2/project1/data
同様に存在するファイルを変更し、コミットしようとしました。ここでも「No such Revision: 13456」と表示されます。
SERVER1 の rev-13456 の WChttp://SERVER2/project1/data
が SERVER2の rev-12345 に再配置されると、これら 2 つのリビジョン間で行われたすべての違いが表示されることを期待していました。
注:SERVER1はしばらくするとシャットダウンされるため、上記を試しています。現在、両方のリポジトリが存在します。SERVER1 はまだ人々によって使用されており、SERVER2 は SERVER1 の最新の状態に保たれます。