Как совместное использование общих библиотек работает для Linux-систем с различными наборами инструментов?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как совместное использование общих библиотек работает для Linux-систем с различными наборами инструментов?

Сообщение Anonymous »

Я хотел бы понять, что именно происходит во время компиляции/выполнения, когда исполняемый файл C++ пытается запуститься в Linux. Я знаю, что это несколько расплывчато, поэтому я постараюсь быть более конкретным в следующих абзацах, но это в некотором смысле суммирует мой вопрос...

Когда вы компилируете исполняемый файл C++, имеющий зависимости (библиотеки), они приходят либо в статической, либо в общей форме (игнорируя тип, содержащий только заголовок). Затем вы можете связать их статически или динамически с тем, что вы создаете. Но это кажется правильным лишь до некоторой степени, поскольку даже для самых простых программ существуют некоторые зависимости, например. libstdc++.so (который обычно имеет символическую ссылку на какую-то конкретную версию в вашей системе), glibc.so и т. д.
Для меня это имеет смысл, поскольку код C++ должен выполняться «где-то», т. е. main не вызывается просто волшебным образом, поэтому код, который на самом деле вызывает main, должен где-то находиться и находится в glibc.so (вероятно?). Точно так же стандартная реализация C++ должна где-то находиться, например, libstdc++.so.
Что мне не ясно, так это то, насколько «отделены» эти вещи друг от друга. Обычно ваш дистрибутив Linux поставляется с какой-либо версией gcc, назовем ее A, но вы, конечно, можете установить рядом с ней любую другую, скажем, B. Конечно, версия B будет содержать свою версию libc.so.B, libstdc++.so.B, libgcc_s.so и т. д.
Теперь я создаю исполняемый файл с помощью gcc-B, назову его b.out. Запуск ldd покажет (при условии, что я не указал ничего другого), что этому b.out нужны libc.so.B, libstdc++.so.B и т. д. Если я возьму b.out и перенесу его в систему только с набором инструментов A, то, по моему мнению, я не смогу его запустить, поскольку мне не хватает *.so. Б.
Но дело в том, что иногда мне кажется, что я могу, а иногда нет.
Я знаю, что ответ лежит где-то в отношении (g)libc.so и libstdc++. so, а также все возможные флаги (, -fPIE, -static-pie и т. д.), но мне очень трудно разобрать эти вещи и установить правильные связи.

Я ищу запрос на рекомендацию, так как уверен, что я не первый человек, который когда-либо сталкивался с этим. Конечно, если кто-то готов ответить прямо здесь, я более чем готов прочитать (но я пока не смог найти ничего удовлетворительного в Stack Overflow), но я уже был бы рад просто получить указатель, где я можете прочитать об этом.

Подробнее здесь: https://stackoverflow.com/questions/793 ... t-toolchai
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»