2013-02-18 20 views
9

私はftdi D2XXドライバを使用してENTTEC DMX usb proデバイスとインターフェースするプロジェクトに取り組んでいます。 ftdiドライバ(/ usr/local/lib /に格納されているlibftdi2xx.so.1.1.12)は、glibc v2.14以降のバージョンに対してコンパイルされます。コンパイルされたライブラリをglibcの新しいバージョンにリンクする

私はglibc v2.13までしかサポートしていないdebian 7で開発しています。 (それはFTDIのドライバへの呼び出しを行う)私が書かれているCのコードを実行するとき、それはエラーを与える:

./a.out: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/libftd2xx.so) 

これはglibcのバージョンに互換性があることを知って、理にかなっています。私は自分のコンピュータ上で、コールを使用して(「〜/ glibcのテスト//libに/インストール」)一時ディレクトリにはglibcの最新版(v2.17)をダウンロードしてインストールしている:

~/glibc-testing/install/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-testing/install/lib/ ./a.out 

をしてこの呼び出しでは、Cコードを正常に実行することができます。

このCコードを共有ライブラリにコンパイルしたいと思います。これはDMXデバイスとのインターフェイスに使用され、C#で開発されたメインアプリケーションによって呼び出されます。

私は前進する方法がわかりません。私がやる必要があるのは、アプリケーションの残りの部分に通常のライブラリを使用させながら、新しいglibcを常に使用するようfdtiドライバに指示することです。 ftdi 2DXXドライバは、プリコンパイル(ソースコードなし)のみで利用できます。このプリコンパイルされたプログラムを新しいライブラリにリンクする方法はありますか?

LD_LIBRARY_PATH =/home /.../ glibc/install/lib /にエクスポートするオプションを調べましたが、ほとんど成功しませんでした。

ありがとうございました!

+5

唯一目立った措置は、ドライバを作成して誰かと通信し、以前のglibcにリンクしたバージョンをリクエストすることです。 –

+0

LD_PRELOADを使用してみましたか? – maha

+0

私はrpathを設定すると、トリックを行う必要があります、[ここ](http://www.eyrie.org/~eagle/notes/rpath.html)を参照してください。 [コンパイル後にアプリケーション内のrpathをリセットすることもできます](https://stackoverflow.com/questions/13769141/can-i-change-rpath-in-an-already-compiled-binary)! – Bort

答えて

0

これは、debianからsidに更新される亜種です。

別のオプションは、これらのファイルには、システム内のライブラリを検索するパスを含むファイル/etc/ld.so.conf.d/libc.conf/etc/ld.so.conf.d/x86_64-linux-gnu.conf

を変更することです。

0

あなたが提供する共有ライブラリのRPATH変更するPatchELFを使用することができます。

$ patchelf --set-rpath /home/user/glibc-testing/install/lib/ libftdi2xx.so.1.1.12 

をそして使用して共有ライブラリをコンパイル:コンパイル

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/ <rest of flags> 

任意の実行可能ファイルをしてコンパイルする必要があります:

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/ -Wl,--dynamic-linker=/home/user/glibc-testing/install/lib/ld-linux-x86-64.so.2 <rest of flags> 
1

自分で機能を提供することができますこれらのコードはバージョン管理されていますが、マップファイルを提供するか、コードと共にすべてを実行することができます。例:

#define SYMVER(ver, sym) __asm__(".symver " #sym "," #sym "@" #ver "\n") 

SYMVER(GLIBC_2.14, foo); 
int foo(int a, char *b) 
{ 
    return 4; 
} 

実装するかを把握するためには、readelfが使用することができます限りの機能が行くように、それだけです

readelf -s /usr/local/lib/libftd2xx.so | grep '@GLIBC_2\.14' 

を。

ローダーには正しいライブラリがあると信じられるようになりました(独自のローダーを実装しない限り)。GLIBC_2.14への参照を削除するためにライブラリにパッチを適用する必要があります。 libcを特に見てください。

進めるにはいくつかの方法があります。 GLIBC_2.14GLIBC_2.13に置き換えるのが一番簡単なのですが、交換記号(つまりGLIBC_2.13)のシンボルは、バージョンが参照として保存されているため、定義する必要があります。

プログラムを実行する必要があります。

さて、理論的にはあなたの代わりにできます。

  • は、そこVERNEEDエントリを検索し、最後に次のプログラム ヘッダのDYNAMICタイプのエントリを見つけ、ELFファイルを解析 あなたがすべきこと1 の参照を切り捨てることができる必要条件の表を見つけてください(利用可能であれば、のセクションヘッダー.gnu.version_rセクションヘッダーも使用できます)。

  • また、標準の ローダーをチェーンするローダーを書くこともできますが、ptraceを使用してルックアップをオーバーライドします。

関連する問題