• ベストアンサー

共有ライブラリのシンボル削除

とてもセキュリティを深く考えなければならない共有ライブラリ(.so)を作成しています。 作成したライブラリからシンボルを完全に削除したいのですが,例えば,mylib.so というライブラリ名だとすると $ strip mylib.so とすれば,nmコマンドではシンボルは表示されなくなりました。 しかし,バイナリエディタで mylib.so を開くと,エクスポートするつもりのない内部関数まで,見えてしまっています。 バイナリエディタで開かれても,関数名を見えなくする方法はありますでしょうか。 ご存知の方,ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.1

コンパイルの段階で細工しないと駄目でしょう。 私が思いつく方法は.. !!ぜーーんぶの関数をインライン展開させる!! ぐらいですねぇ。(ファイルサイズがドえらく増加する危険アリ) # シンボルが見えることとセキュリティとの関係のほうが気になる…

mamekuro
質問者

お礼

質問後もいろいろと検討しましたが,どうも現実的な解決策がなさそうなのであきらめました。 ご回答,ありがとうございました。

関連するQ&A

  • 共有ライブラリロードエラー(_Znwj)

    LINUXのGCCで,共有ライブラリを作成しようとしています。 ライブラリとして提供する関数の中で,エリアを new しているものがあるのですが,こうして作成したライブラリ(mytest.so.1.0)をアプリケーションから dlopen() で開こうとすると,  Error of dlopen() : ./mytest.so.1.0: undefined symbol: _Znwj となってしまいます。 この _Znwj というのがよくわからないのですが,nmコマンドでmytest.so.1.0 の情報を表示してみると,     :  00001e18 A _DYNAMIC  00001dcc A _GLOBAL_OFFSET_TABLE_   U _Znwj  00001dc0 ? __CTOR_END__  00001dbc ? __CTOR_LIST__     : となっており,確かに“未定義”として _Znwj というのが表示されます。 共有ライブラリの中で new を使用する場合は,なにか注意点などあるのでしょうか。 たとえば,コンパイルオプションでなにかを指定するとか・・ C/C++系の質問コーナーに発言するほうが良いのかもしれませんが,LINUX特有のことなので,こちらに質問しました。 ご存知の方,教えてください。

  • 共有ライブラリから読み込んでいるシンボルを自動的に更新・反映したい

    お世話になります。 Flashムービーを作成中です。 共有ライブラリをサンプルライブラリに置いて、 そこからシンボルを読み込んで実ムービーを作成しています。 共有ライブラリに置いてあるシンボルの色などを変更した場合、 ムービー側のライブラリに反映するためにシンボルを選択して 「更新」を押すと変更が反映されます。 これはこれで便利なのですが、実ムービーが大量にあるため、 共有シンボルを変更した際、全てのムービーを開いて更新を押さ なければならず、せっかくの便利機能が効果半減という状態です。 なんとか実ムービーを開いた際などに、共有ライブラリの変更が 自動的に反映(自動的に更新ボタンを押した状態に)される方法はないのでしょうか? 教えてください、お願いします。

    • ベストアンサー
    • Flash
  • UNIX上のプログラムで使うライブラリの中身を知る方法

    過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか? かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。 駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

  • 共有ライブラリの作成について

    呼び出した関数名の名前を表示させる、 テスト用共有ライブラリ「testLib.so」を作成しようと思っています。 そしてそのライブラリを他のプログラムから呼び出すというものです。 以下、内容。 int test1(void){ printf("test1 program."); } int test2(void){ printf("test2 program."); } int test3(void){ printf("test3 program."); } 【パターン1】 上記関数毎でファイル分けし、 test1.c、test2.c、test3.c と言うファイルを作成。 これらの各オブジェクトを取り込んで共有ライブラリを作成するパターン。 【パターン2】 全ての関数を「testDisp.c」と言うファイルに記述し、 このオブジェクトファイルで共有ライブラリを作成するパターン。 上記パターン1と2では用途によって使い分け方法があると言う話を先日聞いたのですが、どの様な場合に1、どの様な場合に2のパターンを使用するのでしょうか。 宜しくお願い致します。

  • シンボルに@n接尾辞がついているライブラリへのリンク(Fortran)

    インテル fortran Windows版 ver.11を使用しています。 あるライブラリを使用したf90のプログラムをビルドしようとしています。 コンパイルは通っているのですが、 リンクする際にシンボルが見つからずにリンクエラーとなってしまいます。 call func(varA, varB) のソース二対して、 LNK2019: 未解決の外部シンボル_FUNCが参照されました。 というような具合です。 ライブラリの中身を見てみると(nmコマンド) _FUNC@8 のようなシンボルが定義されているのですが、 一方でインテルコンパイラは _FUNC というシンボルを検索しているので未解決となってしまっているようです。 インテルのコンパイラオプション等でこのような@nの接尾辞がついたシンボルを 正しく検索、リンクできるようにする方法はないでしょうか? (サブルーチン名に@8を含めてしまうというのも一つの手段ですが、 @が予約語であるため、サブルーチン名に使用することができません。) ご存じの方がいらっしゃいましたら、ご教授いただけば幸いです。 よろしくお願いいたします。

  • Unsatisfied code symbol エラーについて

    UNIX上でcのプログラムを作成しています。 OSはHP-UX B.11.23 U ia64 (td)です。 共有ライブラリ(~.sl)を作成したのですが、 これを実行モジュール(a.out)にリンクしてコンパイルして、a.outを実行すると、 エラーになってしまいます。 エラーの内容は、 /usr/lib/hpux64/dld.so: Unsatisfied code symbol 'xxxxx' in load module '/.../...~/a.out'. というもので、ライブラリ内にあるはずのxxxxxをa.outで使用しているのですが、 これが見つからないというエラーのように思えます。 ライブラリ内にはいくつか関数を用意していて、そのほかの関数は普通に使えています。 ライブラリを作成するときにincludeファイルを用意していますが、 その中でexternで関数の宣言をしていて、 xxxxxが他の関数と異なった設定をしているとは思えません。 このような場合、エラーの原因としてどのようなことが考えられるでしょうか? ほとほと困っています…。 どなたか解決方法をご教授願います。 またライブラリに含まれる関数を表示させるUNIXコマンドってありましたでしょうか? もしご存知でしたらあわせて教えていただけると助かります。 何か必要な情報で書き足りないものがありましたら、補足いたしますのでご指摘ください。 よろしくお願いいたします。

  • Linux C言語共有ライブラリを作成するときの

    RedHatLinux7.3(2.96-110)、gcc(2.96 20000731)です。 C言語で共有ライブラリを作成しています。このライブラリは呼び出し側のプログラム起動時にロードされるものなのですが、以下の2つの手順で生成されたライブラリは、どのような違いがあるのでしょうか? どちらも呼び出し側からは関数コールで実行できるのですが、どちらが正しいのでしょうか? 【その1】 1) gcc -shared -o libxxx.so xxx.c (ライブラリ生成) 2) gcc ./libxxx.so -o testcall testcall.c (呼び出し側とライブラリをリンクして実行ファイル生成) 【その2】 1) gcc -fPIC -c libxxx.c(ライブラリのオブジェクト生成) 2) gcc -fPIC -c -shared -Wl,-soname,libxxx.so.0 -o libxxx.so.0.0 xxx.o(共有ライブラリ生成) 3) soname設定 4) linkername設定 5) gcc -c -o testcall.o testcall.c(呼び出し側オブジェクト生成) 6) gcc -o testcall testcall.o -lxxx 7) LD_LIBRARY_PATH設定、exportする 以上、ご存知のかた、どうぞよろしくお願いします。

  • 未定義シンボルエラー

    現在、HPサーバからAIXサーバへのアプリ移行中なのですが、 未定義シンボルエラーが発生し対応方法に 困っています。 ご教授のほど、よろしくお願いいたします。 未定義シンボルエラーの関数は、 .iconv、iconv_openの2つです。 このアプリの共通部分でオブジェクトを作成していて、この関数(.iconv、iconv_open)のシンボルをアーカイブファイルに書きにいっています。 このiconvを使用する機能のリンク時にこのアーカイブファイルを 参照しているみたいなのですが、未定義シンボルエラーになり エラーになってしまいます。 アーカイブファイルの状態は、未定義シンボルです。(nmコマンドで 調べました)HP、AIX共に、同様。ですが、HPではすんなり通ってしまいます。 よろしくお願いいたします。

  • 共有ライブラリが見つからない

     お世話になります。  xxxxxというソフトウェアを動作させようとしたところ、下記のようなエラーメッセージが出ました。 > ld.so.1: xxxxx: fatal: libsasl.so: version `SUNWprivate1.1' not found (required by file /usr/lib/mps/libldap60.so) > ld.so.1: xxxxx: fatal: libsasl.so: open failed: No such file or directory > rc = 9 ■質問1  これは、 ・ld.so.1という共有モジュールが ・内部的にrequired by file /usr/lib/mps/libldap60.so というモジュールを呼んでいて ・それがlibsasl.soを呼ぼうとしたときに ・`SUNWprivate1.1'というバージョンのものがない というエラーだと解釈してよろしいでしょうか。 ■質問2  findでlibsasl.soを検索したところ、下記の場所にありました。 > /usr/lib/sparcv9/libsasl.so > /usr/lib/libsasl.so crleコマンドで共有ライブラリの検索パスを見てみたところ、/usr/libは含まれていました。 > @root# crle -v > > 構成ファイル [バージョン 4]: /var/ld/ld.config > デフォルトライブラリパス (ELF): /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps > トラステッドディレクトリ (ELF): /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps > > コマンド行: > crle -c /var/ld/ld.config \ > -l /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps \ > -s /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps  それでもエラーが出るのは ・このディレクトリにあるlibsasl.soが`SUNWprivate1.1'というバージョンではないから という解釈でよろしいでしょうか。 ■質問3 `SUNWprivate1.1'というバージョンのlibsasl.soを検索する方法があるでしょうか。  いろいろですみません。よろしくお願いいたします。

  • 静的ライブラリ利用時の実行ファイルのサイズ

    言語はC++,コンパイル環境はVS2013のリリースモードです. 静的リンクライブラリと動的ライブラリについてはある程度は理解しております. 静的ライブラリに関する質問なのですが,そのライブラリの1部しか利用しない場合でも,利用側プログラムのバイナリにはライブラリのバイナリすべてが含まれてしまうのでしょうか. 例えば,100個の関数から構成される静的ライブラリを作ったとして,あるプログラムAはそのライブラリのうちの10個の関数しか呼び出さないとします. このとき,プログラムAのバイナリは,ライブラリの使わない関数のバイナリもすべて含んでしまうのでしょうか. 自作ライブラリを作成するにあたって,1つの静的ライブラリにプログラムを集中させるべきか否かで悩んでおります.