8

私はサードパーティからの絶対に巨大な.aファイルのセットを持っています。このライブラリセットから5つまたは6つの関数を呼び出す独自のライブラリがあります。私のコードとその(少数の)依存関係を外部ライブラリに含む、はるかに小さい.aファイルを作成したいと思います。

具体的には:

私が持っているもの

  1. external.h

    int foo();
    int bar();
    
  2. libexternal.a

    0000000000000000 T foo()
    0000000000000010 T bar()
    
  3. mylibrary.c

    #include "external.h"
    int foo_wrapper() { return foo(); }
    
  4. mylibrary.h

    int foo_wrapper();
    

欲しいもの

libmylibrary.aのシンボルfoo_wrapper、その依存関係foo、およびfoo内部的に呼び出すものbar(実際には数千の関数を表すもの)を含むファイルを作成したいと思います。external.hこのように、人々はに含めたりリンクしたりすることなく私のライブラリを含めることができますlibexternal.afoo実際にはたくさんの関数があるので、手動でリストするつもりはありません。

できますか?

より詳しく

必要な私のシンボルをリストアップしたいと思います。たとえば、foo_wrapperコマンドラインで指定しても問題ありません。fooしかし、コマンドラインやそれが呼び出す関数を指定することもできません。私が指定しても大丈夫な理由は、使用可能にしたいすべての関数を呼び出すだけのfoo_wrapper1つの関数を記述して、そのシンボルをコマンドラインに配置できるからです。callEverything()

4

2 に答える 2

4

KevinDTimmが言ったように:「ar」を使用して.aファイルを編集し、その中のすべてのオブジェクトファイルを抽出し、必要なものを.aアーカイブに追加することができます。

ライブラリの作成者は、すべての機能を単一の.cファイルまたは複数のファイルに入れることができます。各.cファイルは1つのオブジェクトファイルになります。

オブジェクトファイルの一部だけを取得する機会はないと思います。すべてを取得するか、何も必要ありません。リンク時に、.objファイルをその関数に再度分離するには遅すぎます。直接埋め込まれたアドレスと関数呼び出しが多すぎます。

また、最終的なプログラムには、リンクされた.a静的ライブラリに「アーカイブ」されたobjファイルのサブセットが含まれます。しかし、それぞれのobjファイルは、最終的に完全に実行可能であるか、まったく実行可能ではありません。

于 2013-08-06T21:09:42.553 に答える
0

必要なのはar、*nixのアーカイブプログラムです。

すべてのニーズについては、ここを参照してください(または単に入力してくださいman ar

簡単に言えば、表示する「t」オプション、ライブラリからオブジェクトを抽出する「x」オプション、およびオブジェクトを追加する「r」オプションオプションを探しています。

決定するのにかなりの時間がかかる多数の相互依存関係が存在する可能性があることに注意してください。

于 2012-12-18T22:25:32.687 に答える