5

これが明らかな質問である場合は申し訳ありませんが、Web上で驚くほど少ない参照を見つけました...

私はビジネスパートナーの1人によってCで記述され、Fedora 11上に構築された.soバイナリファイルとして提供されたAPIを使用しています。私たちは、Fedora11開発マシンでAPIを問題なくテストしています。ただし、お客様のターゲットプラットフォーム(たまたまSuSE Enterprise 10.2)でAPIにリンクしようとすると、「ファイル形式が認識されません」というエラーが発生します。

objdumpやnmなどのbinutilsパッケージの一部でもあるコマンドでは、同じファイル形式エラーが発生します。「file」コマンドは私に示します:

ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped

「ldd」コマンドは次のことを示しています。

ldd: warning: you do not have execution permission for `./libuscuavactivity.so.1.1'
./libuscuavactivity.so.1.1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./libuscuavactivity.so.1.1)
[dependent library list]

これは、2つのプラットフォーム上のCライブラリ間の非互換性によるものだと思います。問題は、コードがSuSE10.2で利用可能なものよりも新しいバージョンのglibcなどに対してコンパイルされていることです。この質問は、パートナーのFedora11プラットフォームでSuSE10.2でも実行できるようにコードをコンパイルする方法があるという偶然の機会に投稿しています。

4

6 に答える 6

3

Windowsには、さまざまな領域、サービスパック、インストールされているSDK、および一般的なDLL(DLL Hell、誰か?)間の互換性に問題があります。Linuxは同じ種類の問題の影響を受けません。

私が見た互換性の問題は次のとおりです。

  • ランタイムライブラリの変更
  • リンクライブラリの変更
  • カーネルの変更
  • コンパイラテクノロジの変更(例:EGCS gccバージョンの前後。これが問題になる可能性があります)。
  • パッケージャーの問題(RPMとAPT)

あなたの特定のケースでは、私は彼らに彼らのシステムで「gcc -v」を実行させ、あなたにgccバージョン番号を報告させます。それをあなたが使っているものと比較してください。

半分をビルドするには、そのバージョンのコンパイラを入手する必要があるかもしれません。

于 2009-11-20T16:10:37.813 に答える
3

秘訣は、サポートしたいプラットフォームの中で最も古いカーネルとCライブラリバージョンを使用してLinuxのフレーバーを構築することだと思います。私の仕事では、Debian 4をベースにしており、Debian 4以降、RedHat 3,4,5、SuSE 10、およびその他のさまざまなディストリビューション(SELinuxなど)を非公式にサポートできます。

Linuxの素敵な新しいバージョンを構築することで、古いマシンで人々をサポートすることが難しくなるのではないかと思います。

(編集)Debian4に付属しているデフォルトのコンパイラを使用していることに言及する必要があります。これはGCC4.1.2だと思います。新しいバージョンのコンパイラをインストールすると、互換性が大幅に低下する傾向があります。

于 2009-11-20T16:29:00.473 に答える
3

Linuxディストリビューション間のアプリケーションの互換性の問題を解決するために、Linuxアプリケーションチェッカーツール([1][2][3] )を使用できます。それはあなたのファイルフォーマットとすべての依存ライブラリをチェックします。これは、SuSEおよびFedoraのすべてのバージョンを含むほぼすべての一般的なLinuxディストリビューションをサポートします。

ここに画像の説明を入力してください

于 2011-01-15T21:03:43.447 に答える
2

これは個人的な意見ですが、Linuxでバイナリのみの形式で何かを配布する場合、いくつかのオプションがあります。

  1. 見逃したものには、名目上の「バイナリでいっぱいの.tar.gz」パッケージを使用して、太陽の下ですべてのディストリビューションの.debsと.rpmsの範囲を構築します。最初の部分は理想的ですが面倒です。後半では、ポイント2と3に進みます。

  2. 一部の人が提案しているように、そこで見つけて構築できる最も古いディストロを見つけてください。私自身の意見では、これは一種のばかげた考えです。ポイント3を参照してください。

  3. バイナリを配布し、可能な限り静的にリンクします。特にlibstdc++の場合、これがここでの問題のようです。互換性のないバージョンのlibstdc++が浮かんでいるように見えるため、互換性の悪夢になっています。静的にリンクできない場合は、バイナリの横に* .soファイルを配置し、LD_PRELOADまたはのようなものを使用LD_LIBRARY_PATHして、実行時に優先的にリンクさせることもできます。このルートを使用する場合は、プロジェクトと一緒に他の人の作品を配布しているため、LGPLなどに準拠する必要がある場合があることに注意してください。

もちろん、Linuxではプロジェクトをソース形式で配布することを常にお勧めします。:-)

于 2011-01-15T21:14:24.120 に答える
1

メッセージが認識されないファイル形式である場合、問題はおそらくelmarcoがコメントで言及したもの、つまり異なるアーキテクチャです。動的リンカーのバージョンの不一致である可能性がありますが(よ​​くわかりません)、それは.soファイルが古い動的リンカーで構築されたことを意味します。libcに非互換性があると、これが発生する可能性はないと思います。リンク障害や実行時の問題(非常にまれですが)が発生する可能性がありますが、これは発生しません。

于 2009-11-20T16:39:59.037 に答える
0

Suseについてはわかりませんが、fedoraは最先端にとどまるのが好きです。したがって、ライブラリのバージョンについては非常に正しいかもしれません。ソースコードを入手してSuseマシンでビルドできるかどうかを尋ねてみませんか?

于 2009-11-20T21:26:11.127 に答える