mikrocontroller.net

Forum: PC-Programmierung Programm unter Busybox nicht ausführbar


Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe auf einem STM32 ein Embedded Linux mit Busybox laufen und 
möchte jetzt gerne ein C-Programm darauf ausführen.
Jetzt habe ich ein einfaches "Hello world!"-Programm kompiliert und die 
Binärdatei in das Dateisystem des Embedded Linux kopiert (unter 
usr/bin).

Sobald ich das Programm ausführen möchte bekomme ich die Fehlermeldung 
"applet not found" von Busybox. Nach einiger Recherche habe ich 
herausgefunden, dass ich das Programm wohl erst Busybox "hinzufügen" 
muss. Dabei verzweifle ich allerdings momentan etwas.
Vielleicht hat ja jemand Erfahrungen in dem Bereich und kann mir helfen.

Gruß

: Bearbeitet durch User
Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Busybox muss nur hineinkompiliert werden, wass Du auch davon 
benötigst. Busybox schaut sich an, mit welchem "Namen" (argv[0)) es 
aufgerufen wurde und macht dann das entsprechende. In deinem Dateisystem 
gibt es einen Haufen symbolische Links, die alle auf busybox verweisen. 
Wenn nun aber ein symbolischer Link "xyz" auf busybox verweist und als 
ausführbare Datei aufgerufen wird, busybox aber "xyz" nicht kennt, kommt 
Deine Fehlermeldung.

Da Dein Programm ja erstmal nichts mit busybox zu tun haben sollte, 
liegt der Fehler mit Sicherheit woanders.

Zeig doch mal, was in Deinem Programm steht und was "ls -la" in dem 
Verzeichnis Deines Programms ausgibt...

Autor: yesitsme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir fallen da gerade 2 Sachen ein:
 1. Kompiliertst du für STM32 oder ausversehen für X86?
 2. Der aktuelle Pfad ist nicht im suchpfad für Programme. Setz mal ein 
./ vor deinen aufruf (aus "xyz" sollte dann ein "./xyz" werden)

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"ls -l" reicht natürlich auch...
ggf. könntest Du auch noch die Ausgabe von "file xyz" herzeigen (statt 
xyz natürlich den Dateinamen Deines Programms).

Autor: F. J. (thrillhouse)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Zeig doch mal, was in Deinem Programm steht und was "ls -la" in dem
> Verzeichnis Deines Programms ausgibt...

Das angehängte Bild zeigt die Ausgabe von ls-l wobei mein Programm den 
Namen "hello" hat. Der Quelltext ist einfach:
#include<stdio.h>

int main() {
  printf("Hello World\n");
  return 0;
}

yesitsme schrieb:
> 2. Der aktuelle Pfad ist nicht im suchpfad für Programme. Setz mal ein
> ./ vor deinen aufruf (aus "xyz" sollte dann ein "./xyz" werden)

Das hatte ich bereits versucht. Dabei kommt immer die Meldung 
"Permission denied".

yesitsme schrieb:
> 1. Kompiliertst du für STM32 oder ausversehen für X86?

Das könnte natürich sein. Ich hab das Programm einfach mit "gcc hello.c" 
unter Ubuntu kompiliert und dann die Binärdatei auf mein Board gebracht.

: Bearbeitet durch User
Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst dein Programm Cross-Compilieren, also mit sowas wie arm-xxx-gcc 
hello.c und dann auch ausführbar setzen mit chmod 755 hello

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
user schrieb:
> du musst dein Programm Cross-Compilieren, also mit sowas wie arm-xxx-gcc
> hello.c

Für die "xxx" muss ich doch sicher die Toolchain einsetzten oder? Wenn 
ich arm-2010q1-gcc hello.c ausführe bekomme ich immer "command not 
found".

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F. J. schrieb:
> Das könnte natürich sein. Ich hab das Programm einfach mit "gcc hello.c"
> unter Ubuntu kompiliert und dann die Binärdatei auf mein Board gebracht.

Auf einer x86/amd64 Maschine? Dir ist schon klar, dass ein STM32 
Prozessor
kein x86/amd64 Binary ausführen kann? Du musst den gcc des embedded 
Linux als cross compiler nehmen, sprich, du musst die eine Toolchain 
installieren.

> Ich habe auf einem STM32 ein Embedded Linux mit Busybox laufen und
> möchte jetzt gerne ein C-Programm darauf ausführen.

Welches Embedded Linux?

http://elinux.org/STM32
(älter:) 
http://www.st.com/content/ccc/resource/technical/document/application_note/d3/20/2d/12/cf/b4/44/0e/CD00242717.pdf/files/CD00242717.pdf/jcr:content/translations/en.CD00242717.pdf

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2⁵ schrieb:
> Welches Embedded Linux?

µCLinux in der Version 2.6.33. Ich hab das ganze hier nach gemacht: 
https://github.com/AdrianHuang/stm32f429-linux-builder

2⁵ schrieb:
> Auf einer x86/amd64 Maschine? Dir ist schon klar, dass ein STM32
> Prozessor
> kein x86/amd64 Binary ausführen kann?

Inzwischen schon. Aber wie genau ich das Ganze cross kompilieren muss 
weiß ich noch nicht so ganz.

: Bearbeitet durch User
Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein schneller Blick in das dortige Makefile besagt, dass der passende 
Compiler arm-uclinuxeabi-gcc heissen müsste...

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Ein schneller Blick in das dortige Makefile besagt, dass der passende
> Compiler arm-uclinuxeabi-gcc heissen müsste...

Sorry, das wollte ich eigentlich noch dazu geschrieben haben. Der Aufruf 
"arm-uclinuxeabi-gcc hello.c" hat den selben Effekt wie "arm-2010q1-gcc 
hello.c"

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, der TO hat einfach den Pfad nicht in seine .bashrc 
aufgenommen.
Führe doch mal "export PATH=`pwd`/arm-2010q1/bin:$PATH" in der shell 
aus.
Danach sollten der arm-gcc im Pfad sein. Welches Linux verwendest du auf 
deinem PC? Wohin hast du den arm-gcc entpackt?

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochwas: Normalerweise benötigt man zwei gccs, einen bare-metal, der der 
linux kernel compiliert und dann einen für das uCLinux ABI. Keine 
Ahnung, ob der genannte arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux 
beides kann.

Nachdem ich ein stm32f4 discovery hier habe, habe ich mir mal die 
Dateien runtergeladen und ein make angestoßen.

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2⁵ schrieb:
> Ich denke, der TO hat einfach den Pfad nicht in seine .bashrc
> aufgenommen.
> Führe doch mal "export PATH=`pwd`/arm-2010q1/bin:$PATH" in der shell
> aus.

Das bringt leider auch keine Besserung.

2⁵ schrieb:
> Welches Linux verwendest du auf
> deinem PC? Wohin hast du den arm-gcc entpackt?

Ich nutze die Version 16.04 von Xubuntu (als VM). Der arm-gcc befindet 
sich im Home Verzeichnis.

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2⁵ schrieb:
> Nachdem ich ein stm32f4 discovery hier habe, habe ich mir mal die
> Dateien runtergeladen und ein make angestoßen.

Hm... natürlich ist der cross compiler ein ia32 System. Ich habe hier 
(leider) amd64. Will jetzt eigentlich nicht das ganze ia32 Sub-System 
installieren. Deine Vm ist ein 32bit System?

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem ich die arm-uclinuxeabi-gcc Datei in den selben Ordner wie das 
C-Programm kopiert habe kann ich erfolgreich kompilieren!
Daher erst einmal vielen Dank für Eure Hilfe!


Leider stehe ich nun vor dem nächsten Problem. Wenn ich das Programm 
ausführe kommt es zu einem "SEGV" (Segmentation Fault, richtig?).
Da das Programm so simpel ist, kann ich mir nur vorstellen, dass ich 
nicht genügend Rechte auf dem Betriebsystem habe. Außerdem habe ich 
schon öfter eine Meldung bekommen mit "Read only filesystem". Könnte das 
vielleicht das Problem sein?

Gruß

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F. J. schrieb:
> Nachdem ich die arm-uclinuxeabi-gcc Datei in den selben Ordner wie das
> C-Programm kopiert habe kann ich erfolgreich kompilieren!

Na, dann war das Verzeichnis, in dem "arm-uclinuxeabi-gcc" liegt, nicht 
im pfad. Geb doch mal "export 
PATH=/home/pfad/zum/bin/verzeichnis/armgcc:$PATH"
ein. Aus /home/pfad/zum/bin/verzeichnis/armgcc muss du halt den 
richtigen Pfad machen...

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2⁵ schrieb:
> Na, dann war das Verzeichnis, in dem "arm-uclinuxeabi-gcc" liegt, nicht
> im pfad. Geb doch mal "export
> PATH=/home/pfad/zum/bin/verzeichnis/armgcc:$PATH"
> ein. Aus /home/pfad/zum/bin/verzeichnis/armgcc muss du halt den
> richtigen Pfad machen...

Genau an der Stelle lag mein Fehler. Danke!

Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F. J. schrieb:
> Leider stehe ich nun vor dem nächsten Problem. Wenn ich das Programm
> ausführe kommt es zu einem "SEGV" (Segmentation Fault, richtig?).

Das liegt daran, dass du dem arm-uclinuxeabi-gcc sagen musst, welchen 
ARM du hast und wie der ld linken soll (aus dem µCLinux Makefile):
arm-uclinuxeabi-gcc -march=armv7-m -mtune=cortex-m4 -mlittle-endian -mthumb -Os -ffast-math -ffunction-sections -fdata-sections -Wl,--gc-sections -fno-common --param max-inline-insns-single=1000 -Wl,-elf2flt=-s -Wl,-elf2flt=16384 helloworld.c -o helloworld

Das fertige binary kopierst du dann in dein rootfs nach usr/bin und
baust anschließend dein rootfs neu mit "make build-rootfs".
Das neue rootfs.bin kannst du dann flashen mit
openocd -f board/stm32f429discovery.cfg -c "init" -c "reset init" -c "flash write_image erase romfs.bin 0x08120000"

Dann klappts auch mit dem hello world!

Autor: F. J. (thrillhouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2⁵ schrieb:
> Dann klappts auch mit dem hello world!

So ist es! Vielen Dank für die Hilfe!!!

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.