0

いくつかの問題を抱えているソフトウェアを継承しました。問題は、静的にリンクされているlibcのバージョンに関連していると思います。

これは、x86 QNXNeutrino6.3.2マシンを対象としたWindowsXPマシンで構築しています。

以前は、GCC 2.95.3で構築されたソフトウェア(技術的には、 GCCをラップして呼び出す のはQNXのQCCです)誰かが機能を追加し、新しい機能がそれを必要としたため、GCC3.3.5で構築するために移植する必要がありました。

今、ソフトウェアは私のものです。いくつか追加する必要がありますが、奇妙な動作に気づきました。少し掘り下げた後、2.95.3と3.3.5の両方のlibcへの静的リンクがあることがわかりました。QNXのWebサイトによると、:

GCC 2.95.3(6.2.1または6.3から)とGCC 3.3.5は、異なるC ++ ABIを使用し、異なる名前マングリングを持っています。その結果、GCC2.95.3でビルドされたC++バイナリ(オブジェクト、実行可能ファイル、ライブラリ)をGCC3.3.5でビルドされたバイナリとリンクすることはできません。

これはABIの重大な変更であるため、私は明らかに懸念しています。私はこれのために小さなテストを書きました

#include <stdio.h>

int main()
{
    FILE *stream_ptr = popen("fakename","r"); /// use libc
    return 0;
}

そしてそれを3.3.5で構築しました:

QCC -V3.3.5,gcc_ntox86 small.cpp -o small.out

次に、文字列を使用して、このプログラムに静的にリンクされているものを確認しました

strings -a small.out | grep GCC
GCC: (GNU) 3.3.5 (qnx-nto)
GCC: (GNU) 3.3.5 (qnx-nto)
GCC: (GNU) 2.95.3
GCC: (GNU) 3.3.5 (qnx-nto)

ご覧のとおり、GCC2.95.3のlibcは静的にリンクされています。

私の最初の質問は、3.3.5バージョンのlibcでこのリンクを作成するにはどうすればよいですか?

私の2番目の質問は、そもそもなぜ2.95.3とリンクしているのですか?

私は何を間違っている/行方不明にしていますか?どんな提案でも大歓迎です。

(2.95.3オブジェクトにリンクしているプロジェクトにはおそらく他に60個あり、それらすべてを修正する必要があるため、popen()と彼の親しい友人59人を自分で実装するのは最善のアイデアではありません...)

ありがとう、

カール

アップデート:

したがって、これを修正する方法はまだわかりませんが、QNX 6.3.2の背景について少し説明しているので、後でこれに遭遇した人は、これを難しい方法で理解する必要はありません。

リンカld -- verboseのverboseオプションを使用して、実行するすべてのものを吐き出すことができます。これを行ったときに、次の出力が得られたことに注意してください。

attempt to open C:/QNX632/host/win32/x86/usr/lib/gcc-lib/i386-pc-nto-qnx6.3.0/3.3.5//libc.a failed
attempt to open C:/QNX632/target/qnx6/x86/lib/gcc/3.3.5/libc.a failed
attempt to open C:/QNX632/target/qnx6/usr/i386-pc-nto-qnx6.3.0/lib//libc.a failed
attempt to open C:/QNX632/target/qnx6/usr/lib/libc.a failed
attempt to open C:/QNX632/target/qnx6/x86/lib//libc.a succeeded

ご覧のとおり、リンカはlibc.aの3.3.5バージョンを開こうとしていますが、そこにはありません。他の3台の同僚のコンピューターを調べましたが、3.3.5バージョンのlibc.aはありません。これがABIの重大な変更全体でどのように機能しているかはわかりませんが、このプロジェクトの奇抜さの一部がこの不一致に関係しているのではないかと疑っています。

これは私の最初の質問に答えますが、

1)存在しないlibc.aファイルとリンクさせることはできません。

2)3.3.5バージョンがないため、2.95.3バージョンを選択します。

それは新しい質問を引き起こします:

3)QNXが3.3.5バージョンのlibc.aをこのバージョンのMomenticsと一緒に出荷しないのはなぜですか?(または、もしそうなら、私がそれを逃したので、どこにそれを隠しますか。)

4)実行可能な回避策はありますか?libcを使用せずに、プロジェクトで最も重要な2つのサーバー以外のすべてを構築できましたが、最後の2つを修正するまで、解決策を探しています

アップデートへのアップデート:

QNXの人々と協力して、サポートされていない、テストされていないエンジニアリングバージョンのlibc.a、libm.a、libsocket.aをGCC 3.3.5で構築しました。それ以来、すべてが順調に進んでいます。

4

3 に答える 3

0

他の誰かが同様の問題に遭遇した場合、私の知る限り、ここに私が尋ねた4つの質問に対する答えがあります。彼らは勇気づけられていません。

1)存在しないlibc.aファイルとリンクさせることはできません。もちろん。

2)3.3.5バージョンがないため、libc.aの2.95.3バージョンを選択します。

3)QNXの人々との話し合いの中で、QNX Neutrino 6.3.2の場合、GCC 3.3.5はMomenticsの出荷バージョンに含まれています、テストもテストもされていません。サポートされています。たまたまそこにあります。

4)オプション:

a) Go to a newer version of QNX which uses a newer version of GCC
b) Get source for libc (and libm as it turns out) and build it with GCC 3.3.5.
   This one may pan out. Still waiting on QNX tech support.
c) Get already-built libraries from the QNX folks.
d) Don't use GCC 3.3.5 to build for Neutrino 6.3.2

よろしくお願いいたします。
カール

于 2012-10-24T14:09:27.753 に答える
0

GCC 3.3は先史時代のものですが、QNXの新しいバージョンはありませんか?

コンパイラまたはリンカには、冗長であることを通知するオプションが必要です。これを使用して、リンクされているすべてのライブラリパスとライブラリを確認できます。これは、古いlibがどのようにリンクされているかを示している可能性があります。

于 2012-10-05T09:54:21.813 に答える
0

QNX 6.3.2用にコンパイルするときは、GNU C /C++ライブラリで常に3.3.5を使用します。GNUを指定しない場合、デフォルトでDinkumライブラリを取得します。私は過去にDinkumスレッドの安全性に問題がありました。次のフラグを試してください。

qcc -V3.3.5,gcc_ntox86 -Y_gpp

-Y_gppは、GNUライブラリを使用するようにqccに指示します。

于 2012-10-05T16:23:25.337 に答える