Защо статичната библиотека причинява проблеми с подравняването, ако същата споделена библиотека работи добре?

Имам много странен проблем. Създавам две библиотеки от един софтуерен източник: статична (използвайки ar) и динамична (използвайки gcc). След като свържа моето тестово приложение с динамичната библиотека, то работи добре. Но тестово приложение, свързано със статичната библиотека, съществува или с „грешка при сегментиране“, или с „Необработена грешка: изключение при подравняване ... нелегална инструкция“.

Защо? Знам, че има грешка в моя софтуерен код, но има ли разлика в подравняването на паметта, ако се използва статична библиотека?


person psihodelia    schedule 04.04.2012    source източник
comment
Трудно е да се каже. Те са два различно компилирани кода, с които работите. Това вероятно е грешка във вашия код, която просто не се проявява в един случай.   -  person Dan Fego    schedule 04.04.2012


Отговори (1)


Ако погледнете определението за статично срещу динамично свързване, трябва да е ясно, че оформлението на паметта е много различно за двата въпросни двоични файла.

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

При динамичното свързване тези зависимости се пренаписват в контейнери, които зареждащият се опитва да удовлетвори, когато се зарежда двоичният файл. Действителният обектен код се зарежда някъде в паметта според изискванията за подравняване, които съществуват за динамичните библиотеки.

Следователно най-голямата разлика е в това кой обектен код е включен в двоичния файл. Нещо във вашата статична библиотека се включва, което прави изпълнението дерайлирано. Бих предложил да направите някои селективни модулни тестове на кода на вашата библиотека заедно с проверка на кода, за да се опитате да определите проблема.

person HonkyTonk    schedule 04.04.2012