LINUX.ORG.RU

Как правильно использовать C без стандартной библиотеки?

 ,


1

1

Хочу писать на C для МК, но так, чтобы ни единого байта не было в бинарнике, не от моего кода.

В целом я понимаю, как это всё собрать и слинковать. Вопрос больше в том, что компилятор C в моём понимании генерирует код, рассчитывая на определённый рантайм, который я у него хочу забрать. К примеру я слыхал, что компилятор может генерировать вызовы функций вроде memcpy, если посчитает нужным. Также я не очень хорошо представляю, что происходит до вызова main и насколько это важно.

Также развитие этого вопроса - тот же вопрос про C++.

★★★★★
Ответ на: комментарий от mky

Вообще я не хотел бы, чтобы компилятор делал что-то не очевидное в принципе. Если я пишу цикл, значит его надо компилировать в цикл, а не пытаться в нём распознавать memcpy. Но я понимаю, что мои желания и С не совместимы, для такого надо писать на ассемблере, поэтому, видимо, придётся жить с тем, что дают.

vbr ★★★★★
() автор топика
Ответ на: комментарий от vbr

придётся жить с тем, что дают

Можно поиграться флагами компилятора или вовсе заинлайнить ассемблерные вставки.

DrBrown
()
Последнее исправление: DrBrown (всего исправлений: 1)
Ответ на: комментарий от vbr

Если я пишу цикл, значит его надо компилировать в цикл, а не пытаться в нём распознавать memcpy.

Так компилятор никогда не распознает код с целью замены его на стандартные функции. Наоборот - он может вместо вызова функции memcpy подставить ее ассемблерную реализацию. Так сказать оптимизация скорости работы за счет раздувания размера кода. Но это только если указать ключ - делать такую оптимизацию. Ну и все оптимизации можно отключить.

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от PPP328

Вы не правы, выше по треду много примеров где while *p++ = *t++ заменяется на memcpy

Там включена оптимизация -O3! Без оптимизации компилятор не будет «умничать».

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

Без оптимизации компилятор не будет «умничать».

Попробуй скомпилить вот это с -O0:

struct s {
   char a[100000];
};

void func(struct s *a, struct s *b) {
    *a = *b;
}

Или вот это:

void func(void) {
    printf("Hello\n");
}
i-rinat ★★★★★
()

Программирование - это не ваше. Никто из тех, кто пишет, так не пишет. Но вы можете хотеть что хотите. Только напрасно вы попросили совет, как лучше сделать хуже.

Partisan ★★★★★
()
Ответ на: комментарий от static_lab

https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html:

-ffreestanding
This implies -fno-builtin

и, как ты можешь увидеть выше по ссылкам, mem* добавляется и с опцией -ffreestanding. Можешь даже явно указать -fno-builtin, если не веришь что он подразумевается, ничего не изменится.

utf8nowhere ★★★★
()
Ответ на: комментарий от utf8nowhere

Так а по моей ссылке тогда что не так, если я просто взял твой пример, заменил -ffreestanding на -fno-builtin, и mem* теперь не добавляется?

static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)
Ответ на: комментарий от vbr

В libgcc/compiler-rt можно и посмотреть, оба опенсорсные. Там обычно утилитарные функции из тех которые компилятор может вставить если не имеет другой возможности, например soft-float или деление на таргетах где инструкций которые бы всё это делали аппаратно нет.

a1ba ★★★
()
Ответ на: комментарий от static_lab

В треде уже был пример, где копирование структур всё равно вызовет memcpy.

a1ba ★★★
()
Ответ на: комментарий от sigurd

Согласно man gcc (-ftree-loop-distribute-patterns) компилятор будет умничать и при -O2. Хотя раньше это было с -O3. А завтра может быть и с -O0. В целом, в man написано:

The compiler may generate calls to «memcmp», «memset», «memcpy» and «memmove».

Поэтому разработчики gcc в праве делать что посчитают нужными.

Без оптимизации

Вы бы ещё написали, что в вашем понимании (в плане опций компилятора) без оптимизации, так ведь «gcc -Q --help=optimizers» показывает кучу включеных оптимизаций по умолчанию, например "-faggressive-loop-optimizations".

mky ★★★★★
()

Максимально фичастый фонарик на attiny13a это хороший старт в оптимизацию кода по размеру при минимальной используемой периферии. Дальше можно в биты регистры на stm8 или Stm32

bga_ ★★★★
()
Последнее исправление: bga_ (всего исправлений: 1)
21 июня 2023 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.