LINUX.ORG.RU

Собирайте своё ядро clang'ом!

 , , , ,


1

4

Я тут накатал довольно большой текст на (возможно, очень корявом) английском о том, что нужно собирать линукс clang’ом. Если вдруг хотите ругать мой английский, пожалуйста.

Если совсем кратко, суть такова:

Благодаря усилиям проекта ClangBuiltLinux ядро нормально собирается clang’ом, однако реально хорошо оттестированы только defconfig’и некоторых наиболее популярных архитектур. Предвосхищая вопрос «а какой от этого профит», скажу, что возможно, никакого, так что просто just for fun.

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

  1. Качаете исходники ядра (чем новее, тем лучше, но можно и свежий LTS), накатываете свои любимые патчи, подсовываете ему свой конфиг
  2. Качаете свежий clang (снова, чем новее, тем лучше; я рекомендую взять с apt.llvm.org, если пользуетесть Debian или Ubuntu)
  3. Собираете первое вторым и репортите все ворнинги и ошибки в багтрекер ClangBuiltLinux, а если стесняетесь, можно прямо в этот тред, я перепощу туда

А почему ты ещё не собрал своё ядро clang’ом?

Если вдруг кому-то покажется, что такому место в толксах, перенесите, пожалуйста!

★★★★★

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

@CYB3R даже не может сдержаться и не написать комментарий с набросом, хотя даже сам отмечает, что у него нет пруфов, куда там собирать ядро шлангом…

anonymous
()
Ответ на: комментарий от te111011010

Модули обычно не хотят собираться даже просто из-за отличающейся версии gcc. Возможно это можно обойти, но тем не менее.

anonymous
()
Ответ на: комментарий от CYB3R

Возможно, это debug build?

это как?
.config один и тот-же. Собирал так:

$ time make -j4 deb-pkg LOCALVERSION=-pc #gcc
$ time make CC=clang HOSTCC=clang -j4 deb-pkg LOCALVERSION=-cl #clang

superuser ★★★★★
()

натравил на i915.ko скрипт simd-count

gcc
---------------------
nop:		4612
call:		23578
i486:		2
i586:		1
i686:		2659
sse:		24
sse2:		49
sse4.1:		10
3dnowext:	14

clang
--------------------
nop:		6520
call:		24994
i486:		6
i586:		1
i686:		3865
sse:		26
sse2:		51
sse4.1:		10
sse4.2:		14
sse4a:		15
3dnowext:	16
movbe:		10
Ваши комментарии?

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

3 раза больше инструкций i486 - будет тормозить как в прошлом веке

anonymous
()
Ответ на: комментарий от superuser

sse4a

Оно 100% дизассемблировало какой-то мусор и показывет чушь. sse4a есть только на некоторых старых амд процах.

anonymous
()
Ответ на: комментарий от superuser

то был gcc 7.5, а вот сравнение с 9.3

 		gcc 7.5 	gcc 9.3

nop:		4612 		4618
call:		23578		22901
i486:		2 		2
i586:		1 		1
i686:		2659 		2634
sse:		24 		24
sse2:		49 		49
sse4.1:		10 		10
3dnowext:	14 		14
movbe:		0 		9
gcc хорошеет да?

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

Несовместимость лицензий, конечно, не может не повлиять на качество работы!

mord0d ★★★★★
()

A compiler is a tool translating

a compiler is a tool that translates

and you are probably running one (or multiple) right now

one (or several)

most distro-specific kernels were probably never built with Clang at the time I’m writing this

at the time i was writing this

You can attempt to build your kernel with Clang, report whether or not you succeeded

report whether you succeeded or not

this was part 1/4, i can’t be arsed to read the rest, sorry

anonymous
()
Ответ на: комментарий от te111011010

теоретически ничего не мешает, у модулей, кроме ядра, других зависимостей нет

Harald ★★★★★
()

Не буду, у GCC лицензия кошернее!

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

А можно ли собирать ядро clang-ом, а модули — gcc (или наоборот)?

Разрешаю. Пробуй, рапортуй о том, что получится.

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

Я имею ввиду debug build не ядра, а LLVM. Если сам собираешь, проверь, что конфигурируешь с параметром -DCMAKE_BUILD_TYPE=Release.

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

В любом случае, спасибо!

CYB3R ★★★★★
() автор топика

иногда из-за таких оптимизаций ошибочный код под clang работает, а под gcc где нет «специфических» оптимизаций код как положено падает.

хотя ссылка верна для int, для float у gcc получше чем для int, ну такое. А ты хочешь чтобы они оба компилировали идентично 1 в 1?

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

Оно 100% дизассемблировало какой-то мусор и показывет чушь. sse4a есть только на некоторых старых амд процах.

оно вот что подсчитало

$ grep -i 'lzcnt\|popcnt\|extrq\|insertq\|movntsd\|movntss' asm.i915.ko.clang
   10577:	f3 48 0f b8 c9       	popcnt rcx,rcx
   5b859:	f3 48 0f b8 d0       	popcnt rdx,rax
   5b9ff:	f3 48 0f b8 f2       	popcnt rsi,rdx
   5ba29:	f3 48 0f b8 f1       	popcnt rsi,rcx
   5db63:	f3 48 0f b8 c0       	popcnt rax,rax
   657f7:	f3 48 0f b8 d2       	popcnt rdx,rdx
   6f240:	f3 48 0f b8 fa       	popcnt rdi,rdx
   71e3c:	f3 48 0f b8 c5       	popcnt rax,rbp
   79819:	f3 48 0f b8 c0       	popcnt rax,rax
   8a385:	f3 48 0f b8 c8       	popcnt rcx,rax
   93902:	f3 48 0f b8 c9       	popcnt rcx,rcx
   9492a:	f3 48 0f b8 c0       	popcnt rax,rax
   a3c9e:	f3 48 0f b8 c9       	popcnt rcx,rcx
   a3f8e:	f3 48 0f b8 c8       	popcnt rcx,rax
  118ce3:	f3 41 0f bd c5       	lzcnt  eax,r13d

Подсчет популяции единичных битов POPCNT r, r/m* — (Return the Count of Number of Bits Set to 1) Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-битных регистров. Также присутствует в SSE4A от AMD.

https://ru.wikipedia.org/wiki/SSE4
p/s.: lzcnt интол тоже поддерживает значит (иначе было бы глупо)

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

Странно, использую тот же компилятор, работает быстрее GCC. Может, у меня просто GCC тормозной (использую gcc-10).

CYB3R ★★★★★
() автор топика

Не хочу, не буду!

anonymous
()
Ответ на: комментарий от CYB3R

gcc 7.5 - 8мин 6сек
gcc 9.3 - 9мин 20сек
gcc 10 - не пробывал, но тенденция на лицо

superuser ★★★★★
()

Сборка ядра 5.6.8 (custom) + graysky2/kernel_gcc_patch
Intel i3-7100, 16Gb, tmpfs

             gcc-7.5      gcc-10     clang-11
Build time:

real         8m8,940s    9m45,412s   14m56,947s
user       26m38,469s   32m44,870s   51m19,584s
sys         2m24,796s    2m31,832s    3m27,604s

simd-count i915.ko:

nop:        4612         4469         6520
call:      23580        23234        24996
i486:          2            3            6
i586:          1            1            1
i686:       2659         2674         3865
sse:          24           24           26
sse2:         49           49           51
sse4.1:       10           10           10
sse4.2:        0            0           14
sse4a:         0            0           15
3dnowext:     14           14           16
movbe:         0           10           10

gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 

gcc version 10.0.1 20200416 (experimental) [master revision 3c3f12e2a76:dcee354ce56:44b326839d864fc10c459916abcc97f35a9ac3de] (Ubuntu 10-20200416-0ubuntu1~18.04) 

clang version 11.0.0-++20200427091409+1956a8a7cb7-1~exp1~20200427072009.1648

superuser ★★★★★
()
Последнее исправление: superuser (всего исправлений: 3)
Ответ на: комментарий от anonymous

Я ничего не утверждаю, провожу анализ и интересно мнение спецов.

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

Подсчитывает вот эти инструкции:
pf2iw pfnacc pfpnacc pi2fw pswapd maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw prefetchnta prefetcht0 prefetcht1 prefetcht2 psadbw pshufw sfence
https://yadi.sk/d/pUDGayqj_WaXhQ

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

Часть этих инструкций из sse1. Насколько понял, амуде склепала свою частичную реализацию sse1 под новым именем, из-за тёрок с интелом.

anonymous
()

Если совсем кратко, суть такова:

CC=clang HOSTCC=clang. Соотношение сигнал/шум своей статьи считай сам.

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

у меня OpenBSD потому что :)

А король то голый!

https://isopenbsdsecu.re/mitigations/

Пишут, мол ваш опенок - шляпа:

https://isopenbsdsecu.re/about/

А наверно тогда grsecurity - наше все?

Кстати, кто что думает по поводу патченого ядра:

https://github.com/anthraxx/linux-hardened

???

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

А какая разница?

Кто-то в здравом уме будет крутить на залоченном hardened безопасном сервере приложения типа СУБД, которым нужна скорость?

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

А смысл? когда достаточно залочить только первый GUI слой приложения и быть может еще сервер приложений.

anonymous
()
Ответ на: комментарий от buratino

Больше всего смутило то, что они там впаривают ЦРУшный TOR, АНБшное линупс ядро, пусть с патчами, но без доков, может патчи как раз для более лучшего пенитрирования :)))

А еще они посмешили сравнивая полумертвую HardenedBSD с активно развиваемой OpenBSD, сколько разработчиков у HardenedBSD? Адын? И тот гений (от слова генитально) злобно удалил поддержку 32 bit из HBSD.

Вообще впечатление, что Linux с точки зрения безопасности - это детище США, АНБ ну и т.д. - вы понели.

А OpenBSD - типа Канада, Ландон, не пущаем граждан СШАшки в разработчики опеночного крипто, т.е. Родшильский Китай и что-то в этом духе, или я нафантазировал лишнего? х.з.

Это как бы объясняет первопричины сих срачей с мой скромной IMHO.

anonymous
()
Ответ на: комментарий от superuser

Что-то у меня не загружается ядро собранное gcc-10

Руки у тебя из жопы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.