Witaj na Forum Linuxiarzy
Zanim zalogujesz się, by pisać na naszym forum, zapoznaj się z kilkoma zasadami savoir-vivre'u w dziale Administracja.
Wiadomości z problemami zamieszczone w wątku "Przywitaj się" oraz wszelkie reklamy na naszym forum będą usuwane.

Kompilacja jądra z biblioteką statyczną.

Zaczęty przez rogeros, Październik 23, 2019, 11:34:15 AM

Poprzedni wątek - Następny wątek

rogeros

Witajcie.

Mam taki problem być może błachy ale niestety nie potrafię poradzić sobie z nim.
Przeszukałem już chyba cały internet ale niestety nie znalazłem rozwiązania swojego problemu.

Otóż przygotowuje kernel na urządzenie embeded. Do tej pory jądro mi się kompilowało bez żadnego problemu aż do momentu patcha.

Otóż patch aktualizuje jeden z driverów a do Makefile dorzuca bibliotekę statyczną o rozszerzeniu .a

Niestety podczas kompilacji otrzymuje błąd.

A teraz ze więcej.
Otóż patch nałożony na plik "/drivers/video/fbdev/mxc/mxc_hdmi.c" uzupełnia kod o odwołania
do dwóch funkcji o nazwie kill_firmiware oraz get_firmware.

Patch dodatkowo edytuje plik Makefile dodając tam bibliotekę statyczną.
-obj-$(CONFIG_FB_MXC_HDMI)         += mxc_hdmi.o
+obj-$(CONFIG_FB_MXC_HDMI)         += mxc_hdmi.o libfw.a
(tj. dopisuje na końcu libfw.a)

podczas kompilacji otrzymuje taki komunikat
scripts/Makefile.build:298: target 'drivers/video/fbdev/mxc/libfw.a' doesn't match the target pattern
  Building modules, stage 2.
  MODPOST 274 modules
ERROR: "kill_firmware" [drivers/video/fbdev/mxc/mxc_hdmi.ko] undefined!
ERROR: "get_firmware" [drivers/video/fbdev/mxc/mxc_hdmi.ko] undefined!
scripts/Makefile.modpost:91: recipe for target '__modpost' failed
make[1]: *** [__modpost] Error 1
Makefile:1205: recipe for target 'modules' failed

Plik z biblioteką wgrałem do wspólnego katalogu w którym znajdują się obydwa modyfikowane pliki tj. Makefile oraz driver mxc_hdmi.c.

Niestety nie wiem czy dobrze umiejscowiłem plik libfw.a :(. Wiem że jak usunę ten plik to dostaję komunikat, że nie może odnaleźć w ogole pliku z biblioteką. (więc tutaj chyba jest ok)

Czy biblioteka libfw.a może nie działać ponieważ jest skompilowana dla innej wersji linux??
Ale ale dla takiej samej architektury. Ba nawet na ten sam procesor.

Bardzo proszę o pomoc. :) Ponieważ utknąłem w pracy nad tym problemem i niestety
nie wiem co dalej z tym zrobić.

pavbaranov

Mi to wygląda na wadliwie przygotowany patch. Skąd go wziąłeś? On jest dla wersji kernela, którą kompilujesz?
"Plik z biblioteką wgrałem do wspólnego katalogu" - Po co? Biblioteki winny być udostępnione systemowo, a wgranie jej do "wspólnego katalogu" i tak nic nie da.
Ten kernel budujesz bezpośrednio w Twoim, działającym, systemie czy używasz jakiejś wirtualizacji urządzenia, na którym on będzie działać?

rogeros

Dziękuję bardzo za odpowiedź.

>Skąd go wziąłeś? On jest dla wersji kernela, którą kompilujesz?
Patch wyciągnąłem ze źródeł yocto dostarczonych od producenta sprzętu.
Jako, że swojego kernela buduje poza yocto to wprowadziłem zmiany ręcznie.
Producent wykorzystuje wersję kernela 3.14.52-r0 moja wersja kernela to 4.1.15.

>Ten kernel budujesz bezpośrednio w Twoim, działającym, systemie czy używasz jakiejś wirtualizacji urządzenia, na którym on będzie działać?
Kernela buduje nie na docelowej maszynie a na hoście wykorzystując cross kompilator dla architektury ARM.

>"Plik z biblioteką wgrałem do wspólnego katalogu" - Po co? Biblioteki winny być udostępnione systemowo, a wgranie jej do "wspólnego katalogu" i tak nic nie da.
No właśnie nie do końca wiedziałem gdzie dokładnie mam wgrać bibliotekę libfw.a.
Wgrałem ją do katalogu linux_4.1.15/drivers/video/fbdev/mxc/ w którym znajduje się kernel którego kompiluje.

To może zadam jeszcze dodatkowe dwa pytania.
Czy biblioteka o rozszerzeniu .a kompilowana jest pod konkretną wersję linux?
Czy powinna działać na różnych wersjach?
Gdzie tak właściwie powinienem wgrać plik libfw.a przed kompilacją linux?

dodam tylko że kernel producenta 3.14.52-r0 oraz moja wersja linux_4.1.15 kompilowane są pod tą samą architekturę i procesor,
jeden i drugi kernel działa na sprzęcie docelowym.

Mój kernel linux_4.1.15 poprawnie się kompilował do tej pory. I ewidentnie to wina tej biblioteki libfw.a.
Jak podglądam jej zawartość to w gąszczu kodu widzę nazwy funkcji kill_firmware oraz get_firmware które są użyte w driverze mxc_hdmi.c

Przepraszam za moje laickie pytania. :) ogólnie ogarniam większość rzeczy (nawet bardziej zaawansowanych) linux ale z taką
sytuacją spotkałem się pierwszy raz i utknąłem. Nie wiem co źle robię a że nie jestem leniwy to od 2dni szukałem rozwiązania ale niestety
poddałem się i zdecydowałem się poprosić o pomoc.



pavbaranov

Niekoniecznie patch dla 3.14 musi działać na 4.1. Ogólnie trzeba - chyba - byłoby zrobić jakiś resync tego patcha, ale czy się on nałoży, a kernel będzie prawidłowo działać, to już inna sprawa.
Ok, już zrozumiałem o co z tą "biblioteką" chodzi. To są źródła, a ja zrozumiałem wcześniej, że wrzucasz tam binarkę.

rogeros

Patch modyfikował tylko driver mxc_hdmi.c i plik Makefile.
W tym driverze pojawiły się odwołania do tych dwóch funkcji o których wcześniej wspomniałem.

W pliku Makefile dopisano do linijki z tym driverem obsługę biblioteki libfw.a

Tak więc kod drivera nie wiele się zmienił w stosunku do oryginału.

Ale niestety nie znam się i nie wiem czy....

Biblioteka skompilowana biblioteka libfw.a może być odrzucana ponieważ jest skompilowana dla innej wersji linux?
Czy wgrałem ją w do złego katalogu i dlatego jest odrzucana?

Po "wypakowaniu" zawartości archiwum libfw.a otrzymuje jeden plik o nazwie firmware.o
Po wydaniu komendy

file firmware.o
firmware.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped

Natomiast jeśli w ten sam sposób sprawdzałem wcześniej przed patchem skompilowany driver otrzymywałem

file mxc_hdmi.o
mxc_hdmi.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped

więc wnioskuje, że biblioteka jak i mój kernel kompilowane są pod tą samą architekturę i na
mój rozum biblioteka powinna być akceptowalna.

pavbaranov

Takie coś:
scripts/Makefile.build:298: target 'drivers/video/fbdev/mxc/libfw.a' doesn't match the target pattern
wskazuje, że coś w tym patchu jest skopane. Tak, jakby patch odwoływał się do czegoś, czego nie ma.
Niech jednak się wypowie jakiś informatyk. Prędzej czy później będziesz i tak musiał upublicznić ów patch.

rogeros

hmmm.

może to będzie podpowiedzią jakąś.

W menuconfig kernela przełączyłem aby driver budował się z kernelem
  • a nie jako moduł [M] to kompilacja przeszła do końca bez błędów.

    Czyli powiedzmy problem się rozwiązał ale mimo wszystko chciałbym aby ten driver pozostał jako moduł a przynajmniej dowiedzieć się gdzie leży problem :(


pavbaranov

Nie wszystkie rzeczy można skompilować jako moduł. Niektóre muszą być wkompilowane w kernel. Może to taki przypadek.

Zobacz najnowsze wiadomości na forum