Forum: Compiler & IDEs CodeSourcery: Problem beim Compilieren/Linken


von Michael (Gast)


Lesenswert?

Hey,

mein Ziel ist es ein C-Programm auf dem Beagleboard laufen zu lassen.
Host: Ubuntu, welches als VirtualMachine läuft
Target: Beagleboard Arm7 Linux Angström
Crosscompiler: CodeSourcery Sourcery_G++_Lite

Es gibt zwei Möglichkeiten das C-File zu compilieren/linken:
1) auf dem Host "normal" compilieren/linken mit:
1
arm-none-linux-gnueabi-gcc -o main main.c -mthumb -march=armv7-a -v
und erst auf dem Target mit
1
/home/admin/beagleboard/lib/ld-linux.so.3 --library-path /home/admin/beagleboard/lib:/home/admin/beagleboard/usr/lib /home/admin/code/main
den Ort der Libraries angeben.
(main.c ist der Code; '/home/admin/beagleboard/' ist die Sysroot)
Das funktioniert auch.

Die zweite Möglichkeit:
auf dem Host beim Compilieren/Linken gleich den Pfad zu den Libraries 
auf dem Target angeben. Das mache ich folgendermaßen (nach manual):
1
arm-none-linux-gnueabi-gcc -o main main.c -mthumb -march=armv7-a -Wl,-rpath=/home/admin/beagleboard/lib:/home/admin/beagleboard/usr/lib -Wl,--dynamic-linker=/home/admin/beagleboard/lib/ld-linux.so.3 -v

wenn ich dann aber auf dem Target > main eingebe kommt:
1
-sh: main: not found

Hat jemand eine Idee woran das liegt?
Sind die Befehle richtig?

Grüße
Michael

Ps: Wie kann ich es umgehen nach jedem Start:
1
PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
2
export PATH
eingeben zu müssen?
Habe die Zeile schon am Ende von .profile bzw. .bashrc eingegeben.
Funktioniert nicht.

von hp-freund (Gast)


Lesenswert?


von Michael (Gast)


Lesenswert?

Die Libraries müssten doch vorhanden sein, da der erste Weg ja 
funktioniert...

Oder verstehe ich da was falsch?

Ich habs auch mit -static probiert. Funktioniert aber auch nicht. 
(gleicher Fehler wie oben)
Müsste es da nicht auf jeden Fall laufen, da alles Benötigte mit in das 
File gepackt wird?

Grüße

von hp-freund (Gast)


Lesenswert?

Kannst ja trotz dem mal ldd bzw. readelf -d probieren, dann die aktuelle 
PATH Variable anzeigen und schaun ob die libs drin sind.
Gibt es auf dem Board ein ldconfig ?

von Michael (Gast)


Lesenswert?

So, hab jetzt mal -readelf ausgeführt:
1
> arm-none-linux-gnueabi-readelf -d hello_inc
2
3
Dynamic section at offset 0x568 contains 26 entries:
4
  Tag        Type                         Name/Value
5
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
6
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
7
 0x0000000f (RPATH)                      Library rpath: [/home/admin/beagleboard/lib:/home/admin/beagleboard/usr/lib]

Pfad:
1
admin@beagleboard:~/beagleboard/lib$ ls
2
ld-2.11.1.so               libgcc_s.so              libnss_nis-2.11.1.so        
3
ld-linux.so.3              libgcc_s.so.1            libnss_nis.so.2             
4
libBrokenLocale-2.11.1.so  libm-2.11.1.so           libnss_nisplus-2.11.1.so    
5
libBrokenLocale.so.1       libm.so.6                libnss_nisplus.so.2         
6
libSegFault.so             libmemusage.so           libpcprofile.so             
7
libanl-2.11.1.so           libnsl-2.11.1.so         libpthread-2.11.1.so        
8
libanl.so.1                libnsl.so.1              libpthread.so.0             
9
libc-2.11.1.so             libnss_compat-2.11.1.so  libresolv-2.11.1.so         
10
libc.so.6                  libnss_compat.so.2       libresolv.so.2              
11
libcidn-2.11.1.so          libnss_dns-2.11.1.so     librt-2.11.1.so             
12
libcidn.so.1               libnss_dns.so.2          librt.so.1                  
13
libcrypt-2.11.1.so         libnss_files-2.11.1.so   libthread_db-1.0.so         
14
libcrypt.so.1              libnss_files.so.2        libthread_db.so.1           
15
libdl-2.11.1.so            libnss_hesiod-2.11.1.so  libutil-2.11.1.so           
16
libdl.so.2                 libnss_hesiod.so.2       libutil.so.1                
17
admin@beagleboard:~/beagleboard/lib$ pwd
18
/home/admin/beagleboard/lib

-> die libs sind vorhanden


Und ja, es gibt mehrere ldconfig auf dem Beagleboard.
Ich hab auch versucht eine davon auszuführen, hat aber nicht geklappt.
(sh: ldconfig: not found )
Oder was kann ich mit ldconfig bewirken?

Grüße

von hp-freund (Gast)


Lesenswert?

ldconfig:

"Libraries installieren und aktualisieren
Wenn neue Libraries installiert werden sollen, dann stellt sich die 
Frage, wohin. Zunächst einmal bieten sich die Verzeichnisse /lib, 
/usr/lib und /usr/local/lib an. Sollen aber neue Verzeichnisse angelegt 
werden, die Libraries enthalten, dann muß das der internen Verwaltung 
der Libraries mitgeteilt werden.

Die interne Verwaltung der Libraries wird durch den Aufruf des Programms 
ldconfig vollzogen. Dieses Programm wartet den Library Cache und 
erstellt automatisch die notwendigen symbolischen Links auf Libraries. 
Der Librarie-Cache liegt in der Datei /etc/ld.so.cache und enthält eine 
binär codierte Liste aller dem System bekannten Libraries.

Damit ldconfig diese Datei erstellen kann und auch neu hinzugekommene 
Libraries dort aufgenommen werden, muß ldconfig wissen, welche 
Verzeichnisse nach Libraries durchsucht werden sollen. ldconfig 
durchsucht zunächst die beiden Verzeichnisse /usr/lib und /lib, danach 
alle Verzeichnisse, die in der Datei /etc/ld.so.conf aufgelistet sind.

Wenn also ein neues Programm foo installiert wird, das seine Shared 
Libraries im Verzeichnis /usr/local/foo/lib ablegt, so müssen wir nur 
dieses Verzeichnis in die Datei /etc/ld.so.conf aufnehmen. Nach der 
Installation neuer Libraries und/oder der Neuaufnahme von Pfaden in der 
Datei /etc/ld.so.conf muß das Programm ldconfig ausgeführt werden, bevor 
die neuen Libraries verwendet werden können. Erst nach dem Aufruf von 
ldconfig stehen sie ja in der Datei /etc/ld.so.cache und sind somit dem 
Linker/Loader bekannt."

besser könnte ich ea auch nicht ausdrücken ;-)


Startest Du eingentlich Programme immer mit "sh prog" ?
Wenn ja, beachte das Du damit ein neues shell startest und je nach 
Konfiguration die (Pfad)variablen in der neuen shell nicht wie die 
aktuellen sind. Probier mal in den prog Ordner zu wechseln und dann:
./prog
auszuführen.
Oder zum Test:
sh
echo $PATH

verlassen der shell mit Strg-D.

> es gibt mehrere ldconfig
???



...
hp-freund

von Michael (Gast)


Lesenswert?

Hey HP-Freund,

vielen Dank für deine Hilfe!!!
Also es funktioniert mit ./prog   !!!
Erstaunlicherweise ist es egal, ob man den Target-Pfad zu den Libraries 
beim Compilieren/Linken auf dem Host mit angibt oder nicht. Beides mal 
kann man mit ./prog das Programm auf dem Target ausführen.
Warum gibts dann die Option den TargetPfad mit anzugeben?


Dann noch ne Sache zu dem 'ldconfig':
1
root@beagleboard:/home/admin# find / -iname 'ldconfig'
2
/usr/share/opkg/intercept/ldconfig
3
/var/volatile/cache/ldconfig
4
/sbin/ldconfig                                                                           
5
/home/admin/beagleboard/usr/lib/bin/ldconfig
6
/home/admin/beagleboard/sbin/ldconfig
7
root@beagleboard:/home/admin#
<- das meinte ich mit mehreren ldconfigs

Wenn ich eine davon ausführen will bzw. direkt zu /etc/ld.so.cache 
navigiere wird ld.so.cache beides mal nicht gefunden... ?!?!? Idee?


Viele Grüße
Michael

von hp-freund (Gast)


Lesenswert?

Es scheint mehrere lib "Verwaltungen" auf deinem System zu geben.
Original ist es die /sbin/ldconfig .
Es kann natürlich auch sein das die libs auf deinem Board anders als mit 
ldconfig verwaltet werden, weiß ich aber nicht, hab ich auch nicht...

Das erklärt alle Fragen im Bezug auf libs.

Sorry, mehr kann ich auch nicht sagen. Aber es läuft ja jetzt :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.