Как использовать встроенные функции компилятора без стандартной библиотеки C

Я знаю, что некоторые функции, такие как sin cos min max memcpy могут рассматриваться не как обычные функции, но могут быть заменены встроенные функции (который может быть более оптимальным, чем просто встроенные вызовы функций, когда замена представляет собой (-и) фактическую (ые) инструкцию (и) процессора, такую ​​как прямой вызов FSIN инструкция по стандарту sin функция при компиляции для x86 с модулем с плавающей запятой).

Вопрос, по которому я хотел бы использовать возможности встроенных функций (в C / C ++ в основном в mingw / gcc, возможно, в другом компиляторе), но я не хочу ссылаться на libc, стандартную библиотеку C).

  • Можно ли использовать встроенные функции без ссылки на libc?
  • Являются ли они флагами командной строки, необходимыми для оптимизации этих символов как встроенных?

    (Связано с предыдущим, но перефразировано)

  • Будут ли они автоматически распознаваться по имени или флаг (ы) компилятора необходим для использования встроенных модулей?

2

Решение

Допустим, вы хотели заменить функцию cosвсе, что вам нужно сделать, это заменить каждый случай cos в вашем коде с __builtin_cos, То же самое касается любой другой функции, которую вы можете заменить версией компилятора. Просто приготовьтесь __builtin_ на имя.

Для получения дополнительной информации обратитесь к Руководство по gcc.

2

Другие решения

@randomusername уже объяснил использование __builtin_ префикс для многих общих функций библиотеки Standard C. Я рекомендую использовать #define внести изменения, сохраняя при этом ваш код в чистоте.

#include <math.h>

#define  cos   __builtin_cos
#define  sin   __builtin_sin
#define  printf __builtin_printf

...
printf("Distance is %f\n", cos(M_PI/4.0) * 7);
...

Нет стандартной библиотеки C

Сейчас не использование Стандартная библиотека C, что означает отсутствие ссылок на нее или включение типовых заглушек кода запуска и завершения, ну, с GCC, что возможно с -nostdlib что эквивалентно -nostartfiles а также -nodefaultlibs,

Проблема в том, что вы должны заменить все библиотечные функции, которые вы обычно используете, в том числе системные вызовы (или их оберток / macros из glibc) для любых функций ядра.

Я не знаю портативный или надежный метод, который работает на процессорах или даже обязательно разные семьи (Sysenter против системного вызова (инструкция) против int 0x80 для различных 32 и 64-битных процессоров x86). Есть проблемы с ELF вспомогательные векторы (Elf32_auxv_t) а также vDSO (виртуальный ELF динамический общий объект) это может быть возможным для решения и создания портативного решения, я не знаю.

Точка входа

Я считаю, что все среды GCC используют одну и ту же точку входа по умолчанию, которая является меткой / функцией _start, Обычно это включается в «Startup files» и затем вызывает традиционную точку входа C / C ++ main, Таким образом, вам нужно будет заменить его на минимальную собственную заглушку (которая может быть в C).

Завершение программы

Я не знаю как заменить _exit(rc) или аналогичная функция, необходимая для корректного завершения программы, переносимым способом. Например, в среде Linux необходимо выполнить системный вызов функции ядра SYS_exit (ака __NR_exit или же sys_exit)

void _start(void) {
int rc;
/* Get command line arguments if necessary */
rc = main(0, NULL);
your_exit_replacement(rc);
}

альтернативы

Обычно пользовательские процессы то есть прикладные программы, в отличие от ядер или драйверов операционной системы, принимают на себя накладные расходы на связывание файлов запуска и необходимые накладные расходы, чтобы включить динамическое связывание для библиотеки Startard C, так как память считается дешевой и легко доступной, что для любого реального (фактически что-то) приложения экономия памяти не стоит. Во встроенном домене, где не совсем приемлемо просто предполагать наличие достаточного количества памяти, альтернативой является использование минимальной замены libc. Для Linux есть несколько доступных (например, musl, uClibc, dietlibc), я не знаю, есть ли один для замены с открытым исходным кодом, совместимым с mingw или Windows (ReactOS и Wine).

В дальнейшем

Для получения дополнительной информации, с точки зрения платформы Linux, есть хорошее введение «Привет из мира без libc!» Часть 1 а также Часть 2 Джессика МакКеллар ведет блог в Oracle. Есть также ряд связанных вопросов, и некоторые (частично в некоторых случаях) ответы здесь на stackoverflow об использовании -nostdlib в различных обстоятельствах.

Куда пойти отсюда зависит от ваших целей: образование, встроенный, крошечная программа (Исполняемый файл Linux ELF) или Windows Исполняемый файл PE соревнования.

Майкрософт Виндоус

Существуют различные статьи для среды Microsoft Windows, посвященные исполняемым файлам .COM и .EXE и Windows PE, но обычно использующим среду или сборку Microsoft Visual Studio. «Классика» — колонка Мэтта Пьетрека «Под капотом» «Уменьшить размер EXE и DLL с помощью LIBCTINY.LIB» (Выпуск журнала MSDN за 2001 год) и «Удалите жировые отложения из ваших приложений, используя наши 32-битные инструменты липосакции» с октября 1996 года журнал Microsoft Systems. Другая статья, но я не читал сам, которая, кажется, включает в себя объяснения «Уменьшение размера исполняемого файла».

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector