Я знаю, что некоторые функции, такие как sin
cos
min
max
memcpy
могут рассматриваться не как обычные функции, но могут быть заменены встроенные функции (который может быть более оптимальным, чем просто встроенные вызовы функций, когда замена представляет собой (-и) фактическую (ые) инструкцию (и) процессора, такую как прямой вызов FSIN
инструкция по стандарту sin
функция при компиляции для x86 с модулем с плавающей запятой).
Вопрос, по которому я хотел бы использовать возможности встроенных функций (в C / C ++ в основном в mingw / gcc, возможно, в другом компиляторе), но я не хочу ссылаться на libc, стандартную библиотеку C).
Являются ли они флагами командной строки, необходимыми для оптимизации этих символов как встроенных?
(Связано с предыдущим, но перефразировано)
Допустим, вы хотели заменить функцию cos
все, что вам нужно сделать, это заменить каждый случай cos
в вашем коде с __builtin_cos
, То же самое касается любой другой функции, которую вы можете заменить версией компилятора. Просто приготовьтесь __builtin_
на имя.
Для получения дополнительной информации обратитесь к Руководство по gcc.
@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, что означает отсутствие ссылок на нее или включение типовых заглушек кода запуска и завершения, ну, с 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. Другая статья, но я не читал сам, которая, кажется, включает в себя объяснения «Уменьшение размера исполняемого файла».