9

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

glibc v2.13までしかサポートしないdebian 7で開発しています。私が書いた C コード (ftdi ドライバーを呼び出す) を実行すると、エラーが発生します。

./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 の最新バージョン (v2.17) をコンピューターの一時ディレクトリ ('~/glibc-testing/install/lib/') にダウンロードしてインストールし、次の呼び出しを使用しました。

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

この呼び出しにより、C コードを正常に実行できます。

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

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

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

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

4

3 に答える 3

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。 .

続行するにはいくつかの方法があります。バージョンは参照によって保存されるため、シンボルを置換バージョン (つまり ) でGLIBC_2.14定義する必要GLIBC_2.13があることに注意してください。GLIBC_2.13

これで、プログラムが実行されるはずです。

さて、理論的には、代わりに次のことができます。

  • ELF ファイルを解析DYNAMICし、プログラム ヘッダーでタイプ エントリを見つけ、そこでVERNEEDエントリを検索し、最後にそのエントリに続いて、参照をトリミングできる要件の表を見つける必要があります (.gnu.version_rセクション ヘッダーを使用してそこに到達することもできます)。可能な場合は)。

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

于 2016-09-23T08:11:32.000 に答える
0

Debian を sid に更新する亜種の 1 つです。

/etc/ld.so.conf.d/libc.conf別のオプションは、ファイルを変更することです/etc/ld.so.conf.d/x86_64-linux-gnu.conf

これらのファイルには、システム内のライブラリを検索するためのパスが含まれています。

于 2014-10-01T19:14:05.700 に答える
0

PatchELF を使用して、提供された共有ライブラリのrpathを変更できます。

$ 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>
于 2016-03-31T17:49:05.753 に答える