Я пишу небольшую низкоуровневую библиотеку времени выполнения для развлечения.
Согласно веб-сайту libgcc, низкоуровневые библиотеки времени выполнения — это библиотеки, компиляторы которых генерируют вызовы своих подпрограмм всякий раз, когда им необходимо выполнить какую-то операцию, слишком сложную для создания встроенного кода. GCC использует эту библиотеку автоматически. Clang использует компилятор-rt.
Вы можете использовать -nostdlib
, но это только отключает libgcc, я хочу использовать другую (свою) библиотеку. Благодаря clang я только узнал, как использовать libgcc вместо компилятора-rt LLVM.
Как указать GCC или Clang использовать мою собственную библиотеку вместо libgcc или compiler-rt?
привет You can use -nostdlib, but that only disables libgcc, I want to use different (my) library
что еще можно "отключить"? Итак, используйте свою библиотеку, вы получаете какие-либо ошибки? Я не понимаю - почему -nostdlib не является решением? Есть и другие -no*
переключатели, вы их исследовали? gcc.gnu.org/onlinedocs/gcc/Link-Options.html
В вашем посте нет вопросов. Вы всегда должны писать сообщение с вопросом о переполнении стека, чтобы задать четкий конкретный вопрос. Если вы спрашиваете, как использовать собственную библиотеку вместо стандартной библиотеки GNU C, то, кроме —nostdlib
, вы можете просто указать свою библиотеку в командной строке для компоновки программы после любых других модулей, которым она может понадобиться.
Я не пишу обычную библиотеку C, которую я бы связал с помощью -l. libgcc — это библиотека, которую компилятор использует для выполнения некоторых операций, когда это необходимо. Просматривая параметры ссылок, я не понимаю, как указать GCC использовать другую библиотеку, альтернативную libgcc.
@Андрей: Один из разумных вариантов — просто назвать свою собственную библиотеку libgcc
. Очевидно, что вы не сможете выпускать его под этим именем, но это может помочь вам начать работу.
Связывание работает для библиотек, указанных с помощью -l
, так же, как и для библиотек, указанных полным именем или другими способами. Если вы используете gcc
или clang
для сборки, эти команды вызывают компоновщик со списком библиотек. Вы можете увидеть их, используя переключатель -v
, который заставит их показать команду ссылки, которую они используют. Использование -nostdlib
и указание своей собственной библиотеки — отличный способ заменить свою собственную библиотеку. Если вы не хотите этого делать, вам нужно будет либо установить библиотеку по пути по умолчанию, который использует gcc
или clang
, либо пересобрать их с другими значениями по умолчанию.
Обратите внимание, что настройки по умолчанию будут разными в разных системах. Например, Apple собирает clang
иначе, чем вы можете найти в системе Linux. Поэтому настройка gcc
или clang
для использования вашей библиотеки может отличаться в разных системах.
@EricPostpischil Это не библиотека, которую использует программа, это библиотека, которую использует компилятор.
@Андрей: То есть вы имеете в виду, что это библиотека, которую компилятор использует при собственном исполнении, во время компиляции, а не библиотека, которую он использует при компоновке. В заголовке и тексте вашего сообщения говорится «библиотека времени выполнения», что обычно относится к времени выполнения программы, созданной с помощью инструментов разработки. Вам следует отредактировать их для ясности. Страница , на которую вы ссылаетесь , не посвящена вызовам библиотеки GCC во время ее выполнения. Речь идет о библиотеке, к которой GCC генерирует вызовы, то есть он помещает вызовы библиотечных подпрограмм в код, который он генерирует для компилируемой программы.
Да. GCC генерирует вызовы этой библиотеки при компиляции кода. Я объяснил, что делает рассматриваемая libgcc. Я действительно не знал, что написать в заголовке, GNU называет это библиотекой времени выполнения низкого уровня. Перефразирую на более понятный.
Если вы готовы скомпилировать собственную версию GCC, у меня есть решение.
Если вы новичок в этом, я рекомендую вам прочитать Инструментарий для конкретной ОС, поскольку он дает хорошую информацию по этой теме.
GCC позволяет вам определить LIBGCC_SPEC
в файлах конфигурации во время этого процесса. Как описано в gcc/gcc.cc
,
config.h может определить LIBGCC_SPEC, чтобы переопределить, как и когда используется libgcc.a. включено.
Это позволит вам использовать собственный эквивалент libgcc напрямую, без необходимости возиться с -nostdlib
.
Большое спасибо за этот ответ. Если я не найду, как указать GCC использовать альтернативу libgcc с уже скомпилированным GCC, я попробую этот метод.
Я почти уверен, что команда gcc -nostdlib -lyour_lib
должна работать, поскольку GCC по-прежнему использует вызовы функции, и вы просто перезаписываете ее реализацию. Я не могу проверить это, так как у меня нет вашей библиотеки. Для источника: у меня нет первоисточника, я просто подумал об этом базовом ответе.
С наилучшими пожеланиями, Рафаэль
Большое спасибо. Оказывается, мне просто нужно отключить libgcc и скомпилировать эту библиотеку как любую обычную библиотеку.
Ознакомьтесь с информацией о Автономных и размещенных реализациях