LINUX.ORG.RU

Странный баг при сборке модуля ядра

 ,


0

2

Если добавить опцию "-O0" в ccflags в Makefile

ccflags-y += -g -O0 
То не собирается с руганью
ERROR: modpost: "__show_free_areas" [/usr/src/kts2/tmp/test.ko] undefined!

Если убрать "-О0" или поставить "-О2", то все замечательно собирается.

Воспроизводится на ядрах 6.1 и 6.6 и компиляторах gcc-11.4.0,gcc-13.2

__show_free_areas объявлена в linux/mm.h как extern void

Что за хрень?!

Сборка модуля без оптимизации нужна для понимания где происходит утечка памяти (kmemleak).

Update: Проблема исчезла. Непонятно что было причиной проблемы.

★★★★★

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

Нет такого слова в этом файле.

IMHO Проблема в другом.

Если на объектный файл test.o натравить nm, то после компиляции с "-О0" там есть «U __show_free_areas».

После компиляции с "-О2" в выводе nm этой строки нет.

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

То есть, явно этот симовол не используется.

Можно только гадать, какая оптимизация выкидывает unreachable код, использующий эту функцию. Не знаю, может, кто-нибудь еще подскажет.

Ну, или на воспроизводящий пример посмотреть.

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

Хм. Вот это уже совсем странно.

Получив эту ошибку на 6.6, я откатился на 6.1 и там получил тоже самое.

Сейчас вернулся на 6.6 и оно собирается и с О0 и с О2! Фантастика!

Плохо, что ошибку не воспроизвести снова.

С другой стороны - сейчас все работает так как и должно работать.

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

Если убрать «-О0» или поставить «-О2», то все замечательно собирается.

В ядре есть много макросной и около-макросной магии, которая не работает, если собирать без оптимизаций. Никто не проверяет, что сборка -O0 работает, так что никаких гарантий. Для отладки приходится изгаляться со всякими трюками, чтобы собралось.

i-rinat ★★★★★
()