Почему статическая библиотека вызывает проблемы с выравниванием, если та же общая библиотека работает нормально?

У меня очень странная проблема. Я собираю две библиотеки из одного программного источника: статическую (используя ar) и динамическую (используя gcc). После того, как я свяжу свое тестовое приложение с динамической библиотекой, оно работает нормально. Но тестовое приложение, связанное со статической библиотекой, существует либо с "ошибкой сегментации", либо с "необработанной ошибкой: исключение выравнивания... недопустимая инструкция".

Почему? Я знаю, что в моем программном коде есть ошибка, но есть ли разница в выравнивании памяти, если используется статическая библиотека?


person psihodelia    schedule 04.04.2012    source источник
comment
Сложно сказать. Это два по-разному скомпилированных фрагмента кода, с которыми вы работаете. Вероятно, это ошибка в вашем коде, которая просто не проявляется ни в одном случае.   -  person Dan Fego    schedule 04.04.2012


Ответы (1)


Если вы посмотрите на определение статического и динамического связывания, должно быть ясно, что расположение памяти для двух рассматриваемых двоичных файлов сильно различается.

При статической компоновке весь объектный код, необходимый для удовлетворения зависимостей, созданных в таблице символов компоновщика, включается в результирующий двоичный файл.

При динамической компоновке эти зависимости переписываются в заполнители, которые загрузчик пытается удовлетворить при загрузке двоичного файла. Фактический объектный код загружается куда-то в память в соответствии с требованиями выравнивания, которые существуют для динамических библиотек.

Следовательно, самая большая разница заключается в том, какой объектный код включен в двоичный файл. В вашей статической библиотеке включается что-то, что мешает выполнению. Я бы предложил провести выборочное модульное тестирование кода вашей библиотеки вместе с некоторой проверкой кода, чтобы попытаться точно определить проблему.

person HonkyTonk    schedule 04.04.2012