2017-12-19 20 views
0

foo.olibVendorBar.alibVendorZoo.aに従います)で構成されるlibfoo.aを出荷したいと思います。依存ライブラリのシンボルのみを削除するにはどうすればよいですか?

私がlibfoo.aをリンクして生成すると、libVendor*.aのシンボルは、潜在的なクライアントアプリケーションがリンクする可能性があるため、まだ公開されています。

私のコントロール外の多くの理由から、サードパーティのクライアントがベンダーのライブラリと直接リンクできるようにすることは絶対にありません。

gfでlibfooのすべてのlibVendorシンボルを解決して破棄して、libfooのシンボルだけが表示されるようにするにはどうすればよいですか?

現在、LD_FLAGSは使用されていません。すべてが静的にリンクされています。

+0

このhttps://linux.die.net/man/1/stripは見たことがありますか? – zappy

+0

'' strip'は '-K'でも欲しいことをしません。静的ライブラリからアーカイブインデックスと呼ばれるものを破棄しているようです。 ['ranlib'を介してインデックスを再生成した場合](https://stackoverflow.com/questions/11346240/ranlib-and-static-library)、リンクされたバイナリはすべての" branch and link "命令で* super * strangeです無限ループを作成することができます。根本的に何か間違っていることを認識する前に、私は半分ずつ、 'strip'と' ranlib'のフォールアウトをデバッグするのに過ごしました。確かに、gccの中に私が望むことをすることができるものがなければならないのでしょうか? –

+0

https://stackoverflow.com/questions/33851045/gcc-a-static-library-with-undefined-symbolsによると、私が探しているのはすべてのシンボルを完全に解決する '-static'フラグです。私はgccがシンボルの大部分を捨てるのに十分にスマートになることを意味することを望んでいます。私は明日この記事を更新する予定だと思う。 –

答えて

1

残念なことに、静的ライブラリには、-fvisibility=hiddenが共有ライブラリに使用されていません。これは、あなたがベンダーのシンボルがまだ存在している(ベンダーLIBSなしlibfoo.aを出荷することができますできるようになる

ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o 

  • 最初のリンクに必要なすべてのコードfoo.oへ:あなたは、あなたががより多くの仕事で必要なものを達成することができますその中に)。

  • 残念ながら、ライブラリのsymtabからベンダーシンボルを削除することはできません(例:objcopy -Lstrip --strip-symbol)。リンカは、最終実行可能リンクの間に再配置処理のためにそれらを必要とするため、しかし、これはリバースエンジニアリングベンダーのコードからやる気ユーザーを停止しないであろうと

    for sym in all symbols you want to hide; do 
        id=$(echo $sym | md5sum | awk '{print $1}') 
        objcopy --redefine-sym $sym=f_$id foo_linked.o 
    done 
    

    注:しかし、あなたは、少なくとも読めない何かにそれらの名前を変更することができます。

+0

これは受け入れ可能な代替手段です - ありがとう! –

関連する問題