Старая версия libc, связанная с моим двоичным файлом

Я унаследовал часть программного обеспечения, которое имеет некоторые проблемы. Я считаю, что проблемы связаны с версией libc, которая компонуется статически.

Я строю это на машине с Windows XP, ориентируясь на машину x86 QNX Neutrino 6.3.2.

Ранее программное обеспечение, созданное с помощью GCC 2.95.3 (ну, технически, это QCC от QNX, которое обертывает и вызывает GCC). Кто-то добавил функцию и пришлось портировать его для сборки с GCC 3.3.5, потому что в этом нуждалась новая функция.

Теперь программа моя. Мне нужно внести некоторые дополнения, но я заметил странное поведение. Немного покопавшись, я обнаружил, что есть статические ссылки как на libc для 2.95.3, так и для 3.3.5. Согласно веб-сайту QNX, :

GCC 2.95.3 (начиная с 6.2.1 или 6.3) и GCC 3.3.5 используют разные C++ ABI и имеют разное изменение имени. В результате вы не можете связать двоичные файлы C++ (объекты, исполняемые файлы, библиотеки), созданные с помощью GCC 2.95.3, с двоичными файлами, созданными с помощью GCC 3.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)

Как видите, libc для GCC 2.95.3 линкуется статически.

Мой первый вопрос: Как я могу сделать эту ссылку с версией 3.3.5 libc?

Мой второй вопрос: Почему он связан с 2.95.3 в первую очередь?

Что я делаю неправильно/упускаю? Любые предложения приветствуются.

(В проекте, вероятно, есть еще 60 вещей, связанных с объектами версии 2.95.3, и мне нужно исправить их все, поэтому реализация popen() и 59 его ближайших друзей — не лучшая идея. ...)

Спасибо,

Карл

ОБНОВЛЕНИЕ:

Так что я еще не понял, как это исправить, но немного предыстории для QNX 6.3.2, чтобы людям, которые наткнутся на это позже, не пришлось разбираться с трудностями:

Вы можете использовать параметр verbose для компоновщика ld --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

Как видно, компоновщик пытается открыть версию 3.3.5 libc.a, но ее там просто нет. Я просмотрел компьютеры 3 других коллег, и версии 3.3.5 libc.a там нет. Я не уверен, как это работает даже при критическом изменении ABI, но я подозреваю, что некоторая неуклюжесть в этом проекте связана с этим несоответствием.

Хотя это отвечает на мои первоначальные вопросы,

1) Вы не можете связать его с несуществующими файлами libc.a,

2) Он выбирает версию 2.95.3, потому что версии 3.3.5 там нет,

вызывает новые вопросы:

3) Почему QNX не поставляет версию libc.a 3.3.5 с этой версией Momentics? (или, если да, то где они ее прячут, потому что я ее пропустил.)

4) Существуют ли какие-либо жизнеспособные обходные пути? Мне удалось собрать все, кроме двух самых важных серверов в проекте, без использования libc, но пока я не исправлю последние два, я все еще ищет решение.

Обновление до обновления:

Работая с людьми из QNX, они создали мне неподдерживаемую, непроверенную инженерную версию libc.a, libm.a и libsocket.a с GCC 3.3.5, и с тех пор все было хорошо.


person kmort    schedule 04.10.2012    source источник


Ответы (3)


Когда я компилирую для QNX 6.3.2, я всегда использую 3.3.5 с библиотеками GNU C/C++. Если вы не укажете GNU, вы получите библиотеки Dinkum по умолчанию. В прошлом у меня были проблемы с безопасностью потоков Dinkum. Попробуйте эти флаги:

qcc -V3.3.5,gcc_ntox86 -Y_gpp

-Y_gpp указывает qcc использовать библиотеки GNU.

person TomH    schedule 05.10.2012

GCC 3.3 является доисторическим, не существует ли более новой версии для QNX?

Должна быть какая-то опция для компилятора или компоновщика, которая скажет ему быть подробным, что вы могли бы использовать, чтобы увидеть все пути к библиотекам и связанные с ними библиотеки. Это может показать вам, как связывается старая библиотека.

person Jonathan Wakely    schedule 05.10.2012
comment
Да, есть более новая версия (на самом деле несколько), но со встроенными системами иногда вы не можете перейти на более новую версию. С этим проектом мы определенно застряли на 3.3.5. Я буду отлаживать многословие. Спасибо, Карл - person kmort; 05.10.2012

Если кто-то еще столкнется с подобной проблемой, насколько мне известно, вот ответы на четыре вопроса, которые я задал. Они не воодушевляют.

1) Вы не можете связать его с несуществующими файлами libc.a. Конечно.

2) Он выбирает версию 2.95.3 libc.a, потому что версии 3.3.5 там нет.

3) Во время обсуждений с людьми из QNX они заявили, что для QNX Neutrino 6.3.2 официальным протестированным компилятором является только 2.95.3, хотя 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

С уважением,
Карл

person kmort    schedule 24.10.2012