www.mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
arm-none-linux-gnueabi-gcc -o main main.c -mthumb -march=armv7-a -v
und erst auf dem Target mit
/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):
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:
-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:
PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
export PATH
eingeben zu müssen?
Habe die Zeile schon am Ende von .profile bzw. .bashrc eingegeben.
Funktioniert nicht.

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab jetzt mal -readelf ausgeführt:
> arm-none-linux-gnueabi-readelf -d hello_inc

Dynamic section at offset 0x568 contains 26 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000f (RPATH)                      Library rpath: [/home/admin/beagleboard/lib:/home/admin/beagleboard/usr/lib]

Pfad:
admin@beagleboard:~/beagleboard/lib$ ls
ld-2.11.1.so               libgcc_s.so              libnss_nis-2.11.1.so        
ld-linux.so.3              libgcc_s.so.1            libnss_nis.so.2             
libBrokenLocale-2.11.1.so  libm-2.11.1.so           libnss_nisplus-2.11.1.so    
libBrokenLocale.so.1       libm.so.6                libnss_nisplus.so.2         
libSegFault.so             libmemusage.so           libpcprofile.so             
libanl-2.11.1.so           libnsl-2.11.1.so         libpthread-2.11.1.so        
libanl.so.1                libnsl.so.1              libpthread.so.0             
libc-2.11.1.so             libnss_compat-2.11.1.so  libresolv-2.11.1.so         
libc.so.6                  libnss_compat.so.2       libresolv.so.2              
libcidn-2.11.1.so          libnss_dns-2.11.1.so     librt-2.11.1.so             
libcidn.so.1               libnss_dns.so.2          librt.so.1                  
libcrypt-2.11.1.so         libnss_files-2.11.1.so   libthread_db-1.0.so         
libcrypt.so.1              libnss_files.so.2        libthread_db.so.1           
libdl-2.11.1.so            libnss_hesiod-2.11.1.so  libutil-2.11.1.so           
libdl.so.2                 libnss_hesiod.so.2       libutil.so.1                
admin@beagleboard:~/beagleboard/lib$ pwd
/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

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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':
root@beagleboard:/home/admin# find / -iname 'ldconfig'
/usr/share/opkg/intercept/ldconfig
/var/volatile/cache/ldconfig
/sbin/ldconfig                                                                           
/home/admin/beagleboard/usr/lib/bin/ldconfig
/home/admin/beagleboard/sbin/ldconfig
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

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.