Использование GCC с новыми glibc и binutils для создания программного обеспечения для системы с более старым sysroot - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть вопрос несколько месяцев назад, и я не могу долго отвечать на него в Google.

Справочная информация: я занимаюсь кросс-компиляцией программного обеспечения для контроллеров, основанных на руке, которые работают с дистрибутивом linux ptxdist,Полный образ linux построен с использованием креста gcc (4.5.2), созданного для glibc-2.13 и binutils-2.21.Стандарт c ++ довольно старый, поэтому я создал новый набор инструментов, который поддерживает c ++ 11 (gcc 4.8.5).Теперь он построен на основе glibc-2.20 и binutils-2.24.Я хочу использовать этот новый компилятор для моего прикладного программного обеспечения на контроллере (не полный образ, а только этот «основной» двоичный файл), который обновляется через систему управления пакетами.

Программное обеспечение, кажется, работает.Мне просто нужно установить LD_LIBRARY_PATH, указывающий на libstdc ++. So.0.19 вместо libstdc ++. So.14 для двоичного файла.Однако он не принимает новый libc, то есть libc-2.20 вместо libc-2.13.

Таким образом, двоичный файл использует libstdc ++. So.0.19, а остальная часть системы не изменяется.

Вопрос: почему это работает?Какие риски я могу ожидать, запустив это программное обеспечение и должен ли я все равно?Например, будет ли двоичный файл пропустить некоторые функции glibc-2.20 в будущем, потому что он просто получит glibc-2.13 на целевой машине?Сборка gcc-4.8.5 против glibc-2.13 невозможна.

Я уже читал, что это зависит от изменений внутри ABI: Влияние на обновление gcc или binutils

Здесь сказано, что C-код совместим, если компоновка GCC4.1 в GCC 4.8.

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

В glibc 2.14 введен символ memcpy@GLIBC_2.14, поэтому практически все программное обеспечение, скомпилированное для glibc 2.20, не будет работать на glibc 2.13, поскольку этот символ там отсутствует.В идеале вы должны создать свой новый GCC против glibc 2.13, а не glibc 2.20.Вы утверждаете, что сборка GCC 4.8.5 против glibc 2.13 невозможна, но в целом это явно не так.

Некоторые более новые функции C ++ будут работать со старой системой libstdc ++, поскольку они зависят исключительно от шаблонов (из заголовкафайлы) и ни одного нового кода в libstdc ++.

Вы также можете исследовать, как работает модель гибридной связи в Red Hat Developer Toolset.Он статически связывает новые части libstdc ++, полагаясь на систему libstdc ++ для общих, старых частей.Таким образом, вы получаете надлежащую совместимость для таких вещей, как исключения и , вам не нужно устанавливать более новую libstdc ++ на целевой.

...