Используйте альтернативу libgcc/compiler-rt с GCC/Clang

Я пишу небольшую низкоуровневую библиотеку времени выполнения для развлечения.

Согласно веб-сайту libgcc, низкоуровневые библиотеки времени выполнения — это библиотеки, компиляторы которых генерируют вызовы своих подпрограмм всякий раз, когда им необходимо выполнить какую-то операцию, слишком сложную для создания встроенного кода. GCC использует эту библиотеку автоматически. Clang использует компилятор-rt.

Вы можете использовать -nostdlib, но это только отключает libgcc, я хочу использовать другую (свою) библиотеку. Благодаря clang я только узнал, как использовать libgcc вместо компилятора-rt LLVM.

Как указать GCC или Clang использовать мою собственную библиотеку вместо libgcc или compiler-rt?

Ознакомьтесь с информацией о Автономных и размещенных реализациях

Richard Critten 16.08.2024 10:49

привет 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

KamilCuk 16.08.2024 12:26

В вашем посте нет вопросов. Вы всегда должны писать сообщение с вопросом о переполнении стека, чтобы задать четкий конкретный вопрос. Если вы спрашиваете, как использовать собственную библиотеку вместо стандартной библиотеки GNU C, то, кроме —nostdlib, вы можете просто указать свою библиотеку в командной строке для компоновки программы после любых других модулей, которым она может понадобиться.

Eric Postpischil 16.08.2024 13:30

Я не пишу обычную библиотеку C, которую я бы связал с помощью -l. libgcc — это библиотека, которую компилятор использует для выполнения некоторых операций, когда это необходимо. Просматривая параметры ссылок, я не понимаю, как указать GCC использовать другую библиотеку, альтернативную libgcc.

Andrej 16.08.2024 15:33

@Андрей: Один из разумных вариантов — просто назвать свою собственную библиотеку libgcc. Очевидно, что вы не сможете выпускать его под этим именем, но это может помочь вам начать работу.

MSalters 16.08.2024 17:22

Связывание работает для библиотек, указанных с помощью -l, так же, как и для библиотек, указанных полным именем или другими способами. Если вы используете gcc или clang для сборки, эти команды вызывают компоновщик со списком библиотек. Вы можете увидеть их, используя переключатель -v, который заставит их показать команду ссылки, которую они используют. Использование -nostdlib и указание своей собственной библиотеки — отличный способ заменить свою собственную библиотеку. Если вы не хотите этого делать, вам нужно будет либо установить библиотеку по пути по умолчанию, который использует gcc или clang, либо пересобрать их с другими значениями по умолчанию.

Eric Postpischil 16.08.2024 20:27

Обратите внимание, что настройки по умолчанию будут разными в разных системах. Например, Apple собирает clang иначе, чем вы можете найти в системе Linux. Поэтому настройка gcc или clang для использования вашей библиотеки может отличаться в разных системах.

Eric Postpischil 16.08.2024 20:28

@EricPostpischil Это не библиотека, которую использует программа, это библиотека, которую использует компилятор.

Andrej 16.08.2024 21:22

@Андрей: То есть вы имеете в виду, что это библиотека, которую компилятор использует при собственном исполнении, во время компиляции, а не библиотека, которую он использует при компоновке. В заголовке и тексте вашего сообщения говорится «библиотека времени выполнения», что обычно относится к времени выполнения программы, созданной с помощью инструментов разработки. Вам следует отредактировать их для ясности. Страница , на которую вы ссылаетесь , не посвящена вызовам библиотеки GCC во время ее выполнения. Речь идет о библиотеке, к которой GCC генерирует вызовы, то есть он помещает вызовы библиотечных подпрограмм в код, который он генерирует для компилируемой программы.

Eric Postpischil 16.08.2024 21:39

Да. GCC генерирует вызовы этой библиотеки при компиляции кода. Я объяснил, что делает рассматриваемая libgcc. Я действительно не знал, что написать в заголовке, GNU называет это библиотекой времени выполнения низкого уровня. Перефразирую на более понятный.

Andrej 16.08.2024 21:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы готовы скомпилировать собственную версию GCC, у меня есть решение.

Если вы новичок в этом, я рекомендую вам прочитать Инструментарий для конкретной ОС, поскольку он дает хорошую информацию по этой теме.

GCC позволяет вам определить LIBGCC_SPEC в файлах конфигурации во время этого процесса. Как описано в gcc/gcc.cc,

config.h может определить LIBGCC_SPEC, чтобы переопределить, как и когда используется libgcc.a. включено.

Это позволит вам использовать собственный эквивалент libgcc напрямую, без необходимости возиться с -nostdlib.

Большое спасибо за этот ответ. Если я не найду, как указать GCC использовать альтернативу libgcc с уже скомпилированным GCC, я попробую этот метод.

Andrej 16.08.2024 15:35
Ответ принят как подходящий

Я почти уверен, что команда gcc -nostdlib -lyour_lib должна работать, поскольку GCC по-прежнему использует вызовы функции, и вы просто перезаписываете ее реализацию. Я не могу проверить это, так как у меня нет вашей библиотеки. Для источника: у меня нет первоисточника, я просто подумал об этом базовом ответе.

С наилучшими пожеланиями, Рафаэль

Большое спасибо. Оказывается, мне просто нужно отключить libgcc и скомпилировать эту библиотеку как любую обычную библиотеку.

Andrej 17.08.2024 13:08

Другие вопросы по теме

Похожие вопросы

Сколько раз отдельно вызываются вершинный шейдер, геометрический шейдер и фрагментный шейдер для отрисовки одного кадра?
Руководства по выводу кортежей в C++17 (CTAD): неявно генерируемые и определяемые пользователем
Может ли кто-нибудь объяснить правила времени жизни объектов и неинициализированной памяти в C++ (контекст: `std::inplace_vector`)?
Как вложенные векторы выглядят в памяти?
Почему перегрузка оператора предварительного приращения не вызывается для моего пользовательского класса итератора в C++?
Синтаксический сахар для синхронизации блока кода в C++
Как ограничить функцию шаблона определенными типами?
Visual Studio C++: копирование проектов и решений с одного компьютера на другой (github не работает)
Странное поведение кнопки EnableWindow при нажатии
Можно ли с уверенностью предположить, что 32-битные числа с плавающей запятой можно напрямую сравнивать друг с другом, если значение соответствует мантиссе?