По крайней мере, в Linux и Solaris статические библиотеки - это всего лишь куча скомпилированных .o, брошенных в один большой файл. При компиляции статической библиотеки обычно используется флаг -fpic, поэтому сгенерированный код зависит от положения.
Теперь скажите, что моя статическая библиотека - B. Я ее построил и получил полученный файл .a, который на самом деле является просто глотком всех зависимых от позиции файлов .o. Теперь у меня есть общая библиотека, которую я хотел бы построить, A, и я хочу, чтобы она статически связывала B. Когда я строю A, я, естественно, буду использовать флаг -fpic, чтобы сделать сгенерированную позицию кода независимой. Но если я связываюсь с B, не смешаю ли я положение зависимых от положения и позиционных объектных файлов?
Я получаю много ошибок перемещения текста, если не указать также -mimpure-text, и я думаю, что это может быть причиной. Кажется, когда я компилирую библиотеку, мне действительно нужно ее скомпилировать 3 раза, общую версию, статическую версию и версию static-that-be-be-used-by-shared-libs. Я прав? Я мог бы просто использовать -mimpure-text, но man-страница g++ говорит, что если вы сделаете это, на самом деле объект не будет разделяться (неясно, все ли они не разделены или только статически связанные части, хотя кто-нибудь знает?),