Не удается найти “syscall_32.tbl”, хотя исходный код ядра установлен.

Вопрос или проблема

ОС:
lsb_release: Ubuntu 20.04.6 LTS
uname -r: 5.15.0-97-generic

У меня подключена камера к USB сетевому адаптеру через Ethernet-кабель, который, в свою очередь, подключен к Linux машине через USB.

Я пытаюсь установить linux usb network adapter. Я загрузил файлы и сюда. Когда скачиваешь и распаковываешь, есть один исходный файл. В readme просто говорится о выполнении команды make.

enter image description here

Когда я запускаю make, я получаю ошибки ниже. Даже если я выполняю sudo make, хотя и нет ошибок Permission denied, я все равно получаю ошибку No rule to make target ...syscall_32.tbl. Я попробовал sudo apt-get install linux-source, и он установил исходники, но syscall_32.tbl все равно отсутствует. Я потерян и не знаю, что еще попробовать?

user@user-Latitude-9410:~/Downloads/USB_Adapter$ make
make -C /lib/modules/5.15.0-97-generic/build SUBDIRS=/home/user/Downloads/USB_Adapter modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-97-generic'
mkdir: cannot create directory ‘.tmp_625049’: Permission denied
mkdir: cannot create directory ‘.tmp_625051’: Permission denied
mkdir: cannot create directory ‘.tmp_625053’: Permission denied
mkdir: cannot create directory ‘.tmp_625056’: Permission denied
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
mkdir: cannot create directory ‘.tmp_625077’: Permission denied
mkdir: cannot create directory ‘.tmp_625079’: Permission denied
mkdir: cannot create directory ‘.tmp_625081’: Permission denied
mkdir: cannot create directory ‘.tmp_625119’: Permission denied
make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/include/generated/uapi/asm/unistd_32.h'.  Stop.
make[1]: *** [arch/x86/Makefile:217: archheaders] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-97-generic'
make: *** [Makefile:30: default] Error 2

ОБНОВЛЕНИЕ
Я попробовал собрать с make M=$PWD по рекомендации @steeldriver, и теперь, кажется, исправилась ошибка No rule to make target..., но теперь я получаю ошибки компиляции. Кажется, он действительно использует старый код. Есть идеи, что мне указать для make, чтобы это решить?

user@user-Latitude-9410:~/Downloads/USB_Adapter$ make M=$PWD
make -C /lib/modules/5.15.0-97-generic/build SUBDIRS=/home/user/Downloads/USB_Adapter modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-97-generic'
  CC [M]  /home/user/Downloads/USB_Adapter/ax88179_178a.o
/home/user/Downloads/USB_Adapter/ax88179_178a.c: In function ‘ax88179_get_settings’:
/home/user/Downloads/USB_Adapter/ax88179_178a.c:688:9: error: void value not ignored as it ought to be
  688 |  return mii_ethtool_gset(&dev->mii, cmd);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/user/Downloads/USB_Adapter/ax88179_178a.c: At top level:
/home/user/Downloads/USB_Adapter/ax88179_178a.c:816:3: error: ‘struct ethtool_ops’ has no member named ‘get_settings’; did you mean ‘get_strings’?
  816 |  .get_settings  = ax88179_get_settings,
      |   ^~~~~~~~~~~~
      |   get_strings
/home/user/Downloads/USB_Adapter/ax88179_178a.c:816:19: error: initialization of ‘int (*)(struct net_device *, struct ethtool_eeprom *, u8 *)’ {aka ‘int (*)(struct net_device *, struct ethtool_eeprom *, unsigned char *)’} from incompatible pointer type ‘int (*)(struct net_device *, struct ethtool_cmd *)’ [-Werror=incompatible-pointer-types]
  816 |  .get_settings  = ax88179_get_settings,
      |                   ^~~~~~~~~~~~~~~~~~~~
/home/user/Downloads/USB_Adapter/ax88179_178a.c:816:19: note: (near initialization for ‘ax88179_ethtool_ops.set_eeprom’)
/home/user/Downloads/USB_Adapter/ax88179_178a.c:817:3: error: ‘struct ethtool_ops’ has no member named ‘set_settings’; did you mean ‘get_strings’?
  817 |  .set_settings  = ax88179_set_settings,
      |   ^~~~~~~~~~~~
      |   get_strings
/home/user/Downloads/USB_Adapter/ax88179_178a.c:817:19: error: initialization of ‘int (*)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *)’ from incompatible pointer type ‘int (*)(struct net_device *, struct ethtool_cmd *)’ [-Werror=incompatible-pointer-types]
  817 |  .set_settings  = ax88179_set_settings,
      |                   ^~~~~~~~~~~~~~~~~~~~
/home/user/Downloads/USB_Adapter/ax88179_178a.c:817:19: note: (near initialization for ‘ax88179_ethtool_ops.get_coalesce’)
/home/user/Downloads/USB_Adapter/ax88179_178a.c: In function ‘ax88179_get_settings’:
/home/user/Downloads/USB_Adapter/ax88179_178a.c:689:1: error: control reaches end of non-void function [-Werror=return-type]
  689 | }
      | ^
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:297: /home/user/Downloads/USB_Adapter/ax88179_178a.o] Error 1
make[1]: *** [Makefile:1911: /home/user/Downloads/USB_Adapter] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-97-generic'
make: *** [Makefile:30: default] Error 2
user@user-Latitude-9410:~/Downloads/USB_Adapter$ 

Замените M=$(PWD) на M=$(shell pwd) в Makefile.

.

Ответ или решение

При установке USB сетевого адаптера под Ubuntu 20.04.6 LTS you столкнулись с проблемой отсутствия файла "syscall_32.tbl" в исходниках ядра, хотя они, казалось бы, установлены корректно. Ошибка проявляется в сообщении "No rule to make target ‘arch/x86/entry/syscalls/syscall_32.tbl’, needed by ‘arch/x86/include/generated/uapi/asm/unistd_32.h’", что указывает на то, что текущая конфигурация вашей системы не может найти требуемый файл для создания модуля ядра.

Теория

Для начала стоит уточнить, что "syscall_32.tbl" — это файл, который используется в процессе сборки ядра, особенно если речь идет о системах, которые поддерживают как 32-битные, так и 64-битные архитектуры. Ключевая информация здесь — отсутствие поддержки определенных инструментов binutils или недостающие условия конфигурации исходного кода ядра, что может препятствовать корректной сборке модулей.

Пример

Часто такие проблемы возникают, когда в системе не установлены требуемые версии инструментов для сборки или необходимого функционала. В частности, отсутствие требуемой поддержки в конфигурации ядра может вызвать подобную проблему. Возможное решение исследовать, использовать ли команда make актуальную информацию и достаточные ресурсы для сборки модулей в вашей конкретной версии ядра, особенно с учетом согласованности версий binutils и компиляторов.

Применение

Проверка исходников ядра

Убедитесь, что исходитки ядра установлены корректно и совпадают с версией работающего ядра. Выполните команду:

uname -r

Затем убедитесь, что в "/usr/src" имеется соответствующая папка для вашей версии ядра, например, "/usr/src/linux-headers-5.15.0-97-generic". Если нет, установите заголовочные файлы командой:

sudo apt-get install linux-headers-$(uname -r)

Установка необходимых инструментов

Проблема с "CONFIG_X86_X32 enabled but no binutils support" может указывать на недостающие пакеты. Попробуйте установить их:

sudo apt-get install build-essential binutils-dev

Изменение Makefile

Что касается ваших попыток с make M=$(PWD), вам предложили заменить на M=$(shell pwd), это может помочь в корректной интерпретации пути файла, но это не всегда решает саму проблему конфигурации ядра. Продолжение получить результаты от команды make после проверки, что вся сборочная модуля поддерживает актуальную версию ядра.

Корректировка исходного кода

Ошибки компиляции, связанные с несовместимыми структурами данных, такими как использование устаревших функций в ax88179_178a.c, указывают на несовместимость с используемой версией API ядра. Необходимо обновить код, чтобы использовать новые функции вместо get_settings или set_settings, возможно, заменив их на подходящие для вашего API версии ядра, такие как ethtool_get_settings и ethtool_set_settings. Проверьте документацию для подходящей версии ядра или сопутствующие модули.

Заключение

Тщательное рассматривание всех вышеупомянутых шагов может помочь устранить нынешние проблемы с избыточными ошибками компиляции и "No rule to make target". Очень важно находиться на актуальных версиях всех инструментов и повторно проверить, поддерживает ли ваше текущее окружение сборки все нужное для успешной compliant работы с вашими драйверами и утилитами.

Оцените материал
Добавить комментарий

Капча загружается...