いくつかの問題を抱えているソフトウェアを継承しました。問題は、静的にリンクされている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で構築しました。それ以来、すべてが順調に進んでいます。