問題タブ [binutils]
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.
assembly - gccを使用せずにC標準ライブラリを使用するガスアセンブリプログラムをldとリンクするにはどうすればよいですか?
cプログラムがどのように機能するか、およびプログラムがlibcを使用できるようにするために必要な最小レベルのコンテンツをより正確に学習するための演習として、私は主にgasとldを使用してx86アセンブリでプログラミングを試みることにしました。
楽しい小さな挑戦として、私はさまざまな自作のダイナミックライブラリにリンクされたいくつかのプログラムを正常に組み立ててリンクしましたが、gccを直接使用せずにlibc関数呼び出しを使用するようにプログラムを最初からコーディングすることはできませんでした。
個々のcライブラリ関数の呼び出し規約を理解し、objdumpとreadelfを使用してgccからコンパイルされたプログラムを徹底的に検査しましたが、ガスアセンブリファイルに含める情報と呼び出すパラメーターについてはどこにも到達していません。 ldでlibcに正常にリンクします。誰かがこれについて何か洞察を持っていますか?
x86マシンでLinuxを実行しています。
assembly - ジャンプ (およびリンク) 命令での MIPS アセンブラの動作がおかしい
それで、私たちは学校で MIPS アーキテクチャを勉強していて、MIPS32 アーキテクチャを実装しています。GNU cross-binutils をアセンブラーとして使用すると思っていましたが、命令 jal、j、および jr を処理するときに奇妙な出力が得られます。アセンブラが間違った場所に命令を挿入しているようです。なぜこれが起こるのか私にはわかりません.MIPSアセンブラがそれほど壊れているとは思えないので、これが起こるはずだと思います.
ここに私のダミーアセンブリファイルがあります:
ただし、逆アセンブルすると、次の出力が得られます。
これは建築上の癖ですか?もしそうなら、これの背後にある理論的根拠は何ですか?
編集:念のためにいくつかのnopを追加してテストしました...
そして、それは私にいくらか正しいと思われるものを与えてくれます。
jal と j が最後の命令で場所を交換するのはなぜですか?
linux - ELFセクションの生のコンテンツのみを抽出するにはどうすればよいですか?
次のことを試しましたが、結果のファイルはまだELFであり、純粋にセクションのコンテンツではありません。
セクションの内容が欲しいだけです。これを行うことができるユーティリティはありますか?何か案は?
c - 動的にリンクされたELFバイナリへのコード/シンボルのパッチ
動的にリンクされたELFバイナリがあり、特定のライブラリ呼び出しをオーバーライド/リダイレクトしたいとします。でこれを実行できることはわかっていますLD_PRELOAD
が、環境に依存せずにバイナリで永続的であり、setuid / setgidバイナリで機能するソリューションが必要ですが、いずれもLD_PRELOAD
実現できません。
私がやりたいのは、追加のオブジェクトファイルからコードを追加し(必要に応じて新しいセクションで)、これらのオブジェクトファイルのシンボルをバイナリのシンボルテーブルに追加して、新しく追加されたバージョンのコードが代わりに使用されるようにすることです。共有ライブラリコード。これは、既存のコードで実際に再配置を実行しなくても可能であると思います。それらが同じファイルにある場合でも、これらは実行時に通常のPLTの方法で解決できるはずです(データではなく関数のみを気にする価値があります)。
「これはやりたくない!」という言葉に沿って答えないでください。または「それはポータブルではありません!」私が取り組んでいるのは、バイナリをわずかにABIと互換性のない代替共有ライブラリ実装とインターフェースする方法です。問題のプラットフォームは、重要な場合はi386-linux(つまり、32ビット)です。何が可能かを間違えない限り、ELFファイルを解析してハックを実行するツールをいくつか書くことはできますが、GNUリンカーやその他のツールを使用して、新しいコードを記述せずにこれを実現する素晴らしい方法があると思います。
gcc - リンカー スクリプトの賢い使い方は?
リンカー スクリプトを使用して ctor のような関数リストを作成する方法を説明する私の回答に対する素晴らしいコメントは、最近の GNU ld が、-Wl,-T...
およびINSERT BEFORE
/を使用して新しいセクションをシステム リンカー スクリプトに移植するためのサポートを大幅に改善したことを指摘しましたINSERT AFTER
。これにより、他のリンカー スクリプトのトリックについて考えるようになりました。
ネットワーク カード ファームウェアの場合、リンカ スクリプトを修正して、ファームウェアのランタイム モジュールをグループ化し、すべてのモジュールが競合せずに L1 キャッシュに配置できる連続したブロックに配置されるようにしました。ストラグラー ( でグループ化できなかった.o
部分) をクリーンアップするために、個々の関数でセクション属性を使用しました。パフォーマンス カウンターは、実際に機能することを確認しました (L1 命令キャッシュ ミスをほとんどゼロに減らしました)。
リンカー スクリプトを使用して、他にどのような巧妙なことを達成しましたか?
gcc - 静的ライブラリをコンパイルするときに、以前の最小カーネル バージョンを設定する
私のディストリビューション (Arch Linux) は最近、そのツールチェーンでサポートされている Linux カーネルの最小バージョンを増やしました。静的にリンクしてから Web サーバーにアップロードする Web アプリケーションをコンパイルしていますが、Web サーバーのカーネル バージョンは、新しいツールチェーンでコンパイルされた静的ライブラリには古すぎます。(サーバー上で静的バイナリを実行しようとすると、セグメンテーション違反が発生します。) GNU ツールチェーン (GCC、binutils、glibc) を使用してアプリケーションをコンパイルし、新しいカーネル バージョンを必要とする機能を除外する方法はありますか?
c - 廃止された関数のリンク時エラーの生成
gcc と GNU binutils を使用して、使用するとリンク時にエラーが生成されるように一部の関数をマークする方法はありますか? 私の状況では、既存のバイナリとの互換性のために削除していないライブラリ関数がいくつかありますが、新しくコンパイルされたバイナリが関数を使用しようとしないようにしたいと考えています。configure
問題のあるコードがヘッダーを無視し、スクリプトを使用して関数の存在を検出し、それら自体をプロトタイピングするため、コンパイル時の gcc 属性を使用することはできません。私の目標は、悪いスクリプトのリンク時エラーを生成してconfigure
、関数の存在を検出しないようにすることです。
編集:アイデア..アセンブリを使用し.type
てエントリーポイントに間違ったものを指定すると、ダイナミックリンカーと互換性がありますが、新しいプログラムをリンクしようとするとリンクエラーが発生しますか?
shared-libraries - binutils で再配置可能な共有ライブラリを作成する
再配置可能な共有ライブラリを生成するカスタム ツールチェーンがあります。これは、これらをメモリにロードして修正する、同様にカスタムの ELF ローダーで動作します。私は現在、gcc と binutils を説得して、このローダーと互換性のある ELF ファイルを作成しようとしています。
残念ながら、binutils は再配置可能な共有オブジェクトの生成を拒否しているようです。PIC 共有オブジェクトを生成しますが、GOT/PLT の余分なオーバーヘッドがあるため、これを行いたくありません (さらに、カスタム ELF ローダーはそれをサポートしていません)。また、再配置可能なオブジェクトを生成しますが、それらは動的オブジェクトではないため、ELF ローダーがそれらをロードできるようにするための適切なセクションがありません。
GNU ld が、同じコマンド ラインで --reocatable と -shared を指定することを拒否する理由がよくわかりません。誰でも私を啓発できますか?そして、私が探しているオブジェクトファイルをldに生成させる呪文を知っている人はいますか?
gcc - gcc は、どの変数からコンパイルされたレジスターに通知しますか
obj ファイル内のバイナリ命令のレジスタがどの変数からコンパイルされているかを知る必要があります。
要するに、各命令のレジスタから変数へのマッピング
例: objdump が obj ファイルのスニペットを次のように与えるとします。
R1 が変数、たとえばvar1をソース コードから格納していることをどのように知ることができるでしょうか? R2 はvar2を格納しますか?
残念ながらreadelfのドキュメントを検索しましたが、無駄でした。
(ソースとバイナリの間の行マッピングを提供することはできますが、それ以上は役に立ちません)
次に、gcc とリンカのデバッグ オプションをいくつか探しました。いくつかの有用な情報が見つかりましたが、それでも私の問題は解決しません。
私が見つけた情報は次のとおりです。
- オプション-fdump-rtl-vartrackはすべての変数を追跡でき、便利なようです。しかし、このオプションを使用してコンパイルすると、予想される *.vartrack ダンプ ファイルが見つかりませんでした。
- オプション*fdump-rtl-vartrack-uidは、各変数の一意の ID (DECL_UID) を示します。しかし、使用中に次のエラーを受け取りました: cc1: エラー: 認識されないコマンド ライン オプション "-fdump-tree-uid"
- オプションfdump-rtl-lregはローカル レジスタの割り当てをダンプしますが、reg から変数へのマッピングをどのように教えてくれるのかわかりません。
誰かが経験やアイデアを持っていますか?
皆さん、ありがとうございました!
ハッキング...
android - binutils-gold は arm/Android をサポートしていますか?
arm-eabi-ld
デフォルトを からインストールされたものに置き換えようとしていますがbinutils-gold
ld
、リンク中に
LOCAL_CFLAGS := -fPIC
Android.mk ではあまり役に立ちません。ゴールドリンカーを使用する機会はありますか?