GCC: компиляция приложения без связывания какой-либо библиотеки

Я знаю, как скомпилировать приложение C без связывания какой-либо библиотеки с использованием GCC во встроенном приложении с нуля, просто настроив функцию (ы) запуска и, в конечном итоге, файл startup.s сборки.

Вместо этого я не могу делать то же самое в Windows (я использую MINGW32 GCC). Кажется, что связывание с -nostdlib удаляет также все, что нужно выполнить перед main, поэтому я должен написать конкретный запуск, но я не нашел никаких документов об этом.

Причина, по которой мне нужно компилировать без C std lib, заключается в том, что я пишу rduced C std lib для небольших 32-битных микроконтроллеров, и я хотел бы протестировать и модульно протестировать эту библиотеку с помощью GCC под Windows. Так что, если есть альтернативный простейший способ, для меня это нормально.

Спасибо.


person Massimo Manca    schedule 15.01.2018    source источник
comment
Вы имеете в виду, что пытаетесь скомпилировать для микроконтроллера? в таком случае вам нужен поддерживаемый пакет инструментальной цепочки. Может быть, вы можете использовать cygwin или mingw для кросс-компиляции для микроконтроллера   -  person ntshetty    schedule 15.01.2018
comment
Я уже могу скомпилировать для микроконтроллера, но это требует больше времени. Я нашел решение, добавляющее переключатели -nostdlib -lgcc в компоновщик, но после этого я не могу отлаживать с помощью gdb, похоже, он не останавливается ни на одной точке останова.   -  person Massimo Manca    schedule 15.01.2018
comment
вы имеете в виду отладку во время выполнения с контроллером?   -  person ntshetty    schedule 15.01.2018
comment
Возможный дубликат компиляции без libc   -  person gj13    schedule 15.01.2018
comment
Может быть, это поможет ...   -  person Serge Ballesta    schedule 15.01.2018
comment
Может помочь   -  person Mosaaleb    schedule 16.01.2018


Ответы (1)


Я нашел решение, добавляющее -nostdlib и -lgcc вместе в ld (или gcc, используемый в качестве компоновщика). Таким образом, стандартная библиотека C не связывается автоматически с приложением, но связывается все необходимое для запуска приложения.

Я также обнаружил, что порядок этих переключателей имеет значение, он может вообще не работать, отсутствует сигнал функции at_exit () или работать без каких-либо ошибок / предупреждений в зависимости от порядка и положения параметров.

Я обнаружил еще одну небольшую сложность при использовании IDE на основе Eclipse, потому что в меню «Настройки» есть несколько разных подходов, поэтому для записи параметров в правильном порядке мне нужно было установить их в разных местах.

После этого у меня возникла новая проблема: я не думал, что библиотеки модульных тестов требуют хотя бы функции, способной записывать в стандартный вывод или в файл.

Я обнаружил, что использование "" и ‹> заставляет компилятор и компоновщик использовать модули библиотеки, которые мне нужны для моей библиотеки и стандартной библиотеки C.

Так, например:

#include "string.h" // points to my library include
#include <stdio.h>  // points to C stdlib include

позволяет мне тестировать все строковые функции моей библиотеки с помощью функций стандартного вывода C stdlib. Он работает как с кросс-компиляторами GCC, так и с GCC.

person Massimo Manca    schedule 18.01.2018