Скомпилируйте общий объект (.so) со статическим glibc

Я строю некоторый код, который должен быть общим объектом (.so).

Проблема в том, что libc на моей сборочной машине может быть новее, чем опубликованные машины, поэтому я хочу статически связываться с ней, чтобы избежать проблем совместимости. (Моя программа использует memcpy, который, по-видимому, GLIBC_2.14, когда он может опуститься до 2,5).

Компиляция с использованием -shared и -static не работает, поскольку crtbeginT.o не был скомпилирован с -fPIC.

Изменить: вероятно, не дубликат GCC, связывающий libc static и некоторую другую библиотеку динамически, повторно? поскольку в этом вопросе речь идет о главном эльфе, связывающем libc статически, а об общем объекте, связывающем libc статически.

4

Решение

Вы хотите статически связать glibc в вашей общей библиотеке.

Вы не должны этого делать.

Если вы попытаетесь это сделать, вы в конечном итоге столкнетесь с нарушением CDR One Definition Rule (ODR). Это потому, что некоторые части glibc будут из «старой» версии вашей целевой машины, а некоторые будут из «новой» версии вашей библиотеки. Результатом является неопределенное поведение.

Правильное решение простое: сборка со старым glibc (таким же старым, как ваша самая старая цель для развертывания). Или соберите несколько раз, по одному разу для каждой версии glibc (если вам действительно нужны новые функции glibc). Даже если вы считаете, что вам нужна новая функция glibc, попробуйте просто вставить эту функцию в свою библиотеку под другим именем, чтобы избежать коллизий.

Относительно memcpy, в частности, смотрите: https://stackoverflow.com/a/8823419/4323 — и для ручного исправления: https://stackoverflow.com/a/5977518/4323

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]