背景: Gentoo LinuxのPortageに似たパッケージマネージャーの開発を検討しています(Portageをフォークしてしまう可能性があります)。Gentooについてほとんど知らない人にとっては、ソースベースのディストリビューションです。つまり、すべてのパッケージがソースコードからコンパイルされます。現在、プログラムをオブジェクトファイルにコンパイルしてから実行可能ファイルにコンパイルすることができます。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
Portageに加えたい改善点は次のとおりです。
理由:私はArch linuxユーザーであり、ソースベースのディストリビューションのアイデアを気に入っていますが、システムを最新の状態に保つという膨大なタスクに煩わされることはありません。また、ほとんどの作業は小さなハードドライブを備えたラップトップコンピューターで行います。そのため、大量のスペースを占めるオブジェクトファイルを保持するのではなく、実行可能ファイルをオブジェクトファイルに逆コンパイル/リンク解除する理由があります。また、ほとんどのソースコードを再コンパイルする必要性が大幅に減少するため、システムの全体的なコンパイル時間が短縮される可能性があります。また、完全に再コンパイルしなくても、パッケージのUSEフラグを簡単に変更できるようになります。
質問:オブジェクトファイルを実行可能ファイルにコンパイルしてから、逆コンパイルしてオブジェクトファイルに戻すことは可能ですか?この例を以下に示します。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
その後
$ SomeCommand executable
output << a.o b.o
これが現在不可能な場合。$ld
プログラムを意図的に「リバースエンジニアリング可能」にするために、GNUのリンカー " "のバージョンを変更して、オブジェクトファイルをリンクするときに行った変更をログに記録することは可能でしょうか?
編集:これの別の使用法は、単一のオブジェクトファイルを大きなプロジェクトの実行可能ファイルから分離しすぎて、分離されたオブジェクトファイルを新しいものと交換して再度リンクすることです。これにより、1つだけが更新されたときに、多くの異なるファイルから大きなプロジェクトを再リンクするオーバーヘッドが削減されます。これにより、バイナリレベルでのインクリメンタルコンパイルが可能になります。
いいえ、これは不可能です。リンカの作業の大部分は、シンボリック参照(リンクされているオブジェクトファイルの任意の組み合わせに対して有効)を数値オフセット(リンカがオブジェクトファイルの特定の組み合わせ、その特定の時間にレイアウトすることを決定した特定の方法に対してのみ有効)に置き換えることです。 。この方法で参照が「ベイク」されると、それらを復元することはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加