2009-09-28 4 views
2

Краткое описание: Множество существующих кодов, которые отлично работают на многих платформах под gcc 4.1, aCC, VisualAge и MSVC. В настоящее время я работаю над тем, чтобы сделать это для нюхания на HP-UX.Статические/глобальные конструкторы на GCC 4.1/HP-UX 11.23

Выход состоит из нескольких (8-10) разделяемых библиотек.

Все компилируется нормально, но при попытке запуска любых тестовых приложений они сразу же segfault в каком-то глобальном конструкторе. Фактически, gdb не может даже получить информацию о том, где находится этот фактический глобальный объект. Si_code - SEGV_ACCERR - Недействительные разрешения для объекта, а указатель 'this' всегда 0

Как это инициализация вызывает ctor объекта, который является нулевым? Является ли это конфликтом между понятием gcc глобальной инициализации и понятием HP (используя HP ld)?

Где будет вы отсюда с точки зрения диагностики? К сожалению, я не могу уменьшить эту проблему до любого типа тестового примера, который воспроизводит проблему.

+1

Бит обновления: По прихоти, я добавил printf в ctor, который был неудачным (он был ранее пуст). Когда в следующий раз я попробовал пример приложения, он разбился на DIFFERENT глобальный конструктор ... так что я повторил и то же самое произошло. Возможно ли, что что-то оптимизирует пустые конструкторы? Это не кажется логичным, но это * * HP-UX – phrakture

ответ

1

Я бы начал с запуска objdump в исполняемых файлах и объектных файлах и совместно используемых библиотеках. Ищите подозрительные вещи, такие как сегменты данных, виртуальный адрес которых равен 0 (т. Е. NULL).

С общими библиотеками, это задача загрузчика , чтобы выполнить привязку во время выполнения, возможно, загрузчик HP-UX не перемещает то, что должно быть.

Также ознакомьтесь с информационными страницами GNU ld. Есть некоторая потенциально полезная информация, указанная в опции CONSTRUCTORS. Различные форматы объектов работают по-разному.

0

Каковы ваши командные строки для компиляции и ссылки для разделяемых библиотек? Не забудьте скомпилировать объекты с помощью "g++ -fPIC -c ..." и соединить их с "g++ -fPIC -shared ..." и не напрямую с "ld -b ...". g++ может ссылаться на дополнительный код поддержки во время выполнения, который может потребоваться на HP-UX.

+0

Да, я использую g ++ в обоих случаях, с -fPIC -mlp64 и дополнительным -shared -Wl, -z на стороне ссылки (плюс несколько другие конкретные флаги проекта) – phrakture

Смежные вопросы