c неопределенной ссылкой на функцию - Компилирование ядра Android / Linux

1

Я компилирую ядро Android 2.6.35, найденное на OMAPZoom.org, и я застрял в том, что, по моему мнению, является глупой проблемой Makefile.

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage

дает следующую ошибку (плюс больше, что связано):

drivers/built-in.o: In function 'dsscomp_createcomp':
drivers/video/omap2/dsscomp/device.c:175: undefined reference to 'tiler_set_buf_state'

драйверы/видео /omap2/dsscomp/device.c имеют следующую директиву #include:

#include <mach/tiler.h>

который, я считаю, ссылается на следующий файл, содержащий прототип:

arch/arm/mach-omap2/include/mach/tiler.h

В свою очередь, tiler_set_buf_state определяется в:

drivers/media/video/tiler/tiler.c

Функция используется правильно, заголовок включен. Это заставляет меня думать, что определение не компилируется. В этом проекте используется довольно большая рекурсивная настройка Makefile.

Я не совсем уверен, что еще я могу здесь внести, что будет полезно, но если есть что-то полезное, спросите меня. Я надеялся, что кто-то может дать мне толчок в правильном направлении.

  • 1
    Неопределенная ссылка в файле .o, как правило, связана с отсутствующей зависимостью ссылки, а не с отсутствующим включением. (Хотя возможное исключение было бы, если бы заголовочный файл фактически должен был обеспечить реализующий код, но вместо этого просто предоставлял прототип) Вы можете проверить, что конкретная строка в исходном коде компилируется, поместив туда #error и проверив, что это останавливает сборку, но вероятность того, что она компилируется, но не связана, остается - вы можете посмотреть полную команду, выпущенную для этого этапа сборки. Вы также можете использовать grep для идентификатора в файлах .o.
  • 0
    Это хитрый трюк, мне придется спрятать его для будущего использования. Благодарю.
Теги:
linux-kernel
compiler-construction

2 ответа

0
Лучший ответ

Ну, это неудобно:

В этом репозитории есть два (релевантных) раздела:

p-android-omap-2.6.35
p-android-omap3-2.6.35

Первый из них не работает с OMAP3 или, по крайней мере, с Zoom3 (конфигурация платы android_zoom3_defoncifg).

Чтобы построить ядро для Zoom3, вы должны использовать вторую (p-android-omap3-2.6.35) ветвь или получить тонны ошибок сборки. Потерял большую часть дня, переписывая "сломанный" код из первой ветки, думая, что это неправильно, потому что я использую более старую доску. Была ли проверка на правильной ветке, и она была построена без каких-либо ошибок.

Сожалею. Надеюсь, это будет полезно для кого-то еще!

1

Что говорят драйверы/медиа/видео /tiler/Kconfig? Вы уверены, что все CFLAGS установлены правильно? Я создал андроид для платформы omap4 и должен был передать эту переменную в моем make файле: "TARGET_BOARD_PLATFORM = omap4". Я точно не проследил, где это происходит (у моей системы тоже есть сложный Makefile). Но вы, вероятно, должны убедиться, что ARCH_OMAP4 правильно установлен где-то в вашем файле makefile.

В моей системе Kconfig имеет:

config TILER_OMAP
    tristate "OMAP TILER support"
    default y
    depends on ARCH_OMAP4
help
       TILER driver for OMAP based boards.

config DUCATI_BUFFER_PROTECTION
    tristate "OMAP DUCATI input buffer protection"
    default y
    depends on TILER_OMAP
help
       Reserve 8MB memory for input buffer protection
  • 0
    Мой Kconfig имеет верхнюю часть, как и ваша, но останавливается перед помощью. Это только для OMAP4? У меня сложилось впечатление, что это работает и на OMAP3. OMAP3 моя цель.
  • 0
    ОК. Это должно быть пользовательской настройкой моего ядра. -DARCH_OMAP4 установлен где-нибудь в вашем config / Makefile?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню