PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [LINUX] Ausführbare Datei nicht gefunden?



hackbert
02-10-2005, 12:43
Moin!
Ich habe hier zwei Dateien. Eine ist in Assembler geschrieben, die andere in C. Nun will ich die ASM-Datei mit dem assembler assemblieren und die C-Datei mit dem gcc kompilieren. Anschließend soll gelinkt werden und ein ELF executable draus werden. Hier mal mein Makefile:

all:
as ccall.s -o ccall.o
gcc -c ccall.c -o ccallc.o
ld -o ccall ccall.o ccallc.o -lc
chmod a+x ./ccall
Der make-Vorgang klappt hervorragend. Auch das chmod greift. Nun gebe ich "./ccall" auf der Konsole ein und es kommt:

bash: ./ccall: Datei oder Verzeichnis nicht gefunden

Zuerst dachte ich, ich hätte mich verschrieben. Habe ich aber nicht, denn wenn ich z.B. "cat ./ccall" eingebe, dann wird die Datei ausgegeben. Ausführen ist aber nicht möglich. Auch nicht per exec. Auch nicht unter einer anderen Shell.
"file ./ccall" gibt dies aus:

./ccall: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Was mache ich falsch???

TIA Hackbert

anda_skoa
02-10-2005, 13:04
Vielleicht ist das in einem Filesystem das noexec gemountet ist.

Ciao,
_

hackbert
02-10-2005, 13:16
Nein. Ganz sicher nicht. Ich habe im selben Verzeichnis Sachen Kompiliert und gestartet. Ist dieselbe Partition auf der auch /bin und Consorten drauf sind.

anda_skoa
02-10-2005, 15:21
Hmm.

Was ist wenn du gcc das Linken überläßt?

Also statt der letzten beiden Zeilen so ewtas:


gcc -o ccall ccall.o ccallc.o


Ciao,
_

hackbert
02-10-2005, 16:53
mit einem Makefile wie diesem hier:

all:
as ccall.s -o ccall.o
gcc -c ccall.c -o ccallc.o
gcc -o ccall ccall.o ccall.o -lc
chmod a+x ./ccall
bekomme ich noch mehr Fehler:


as ccall.s -o ccall.o
gcc -c ccall.c -o ccallc.o
gcc -o ccall ccall.o ccall.o -lc
ccall.o: In function `_start':
: multiple definition of `_start'
/usr/lib/gcc-lib/i486-linux-gnu/3.3.6/../../../crt1.o:../sysdeps/i386/elf/start.S:65: first defined here
ccall.o: In function `_start':
: multiple definition of `_start'
/usr/lib/gcc-lib/i486-linux-gnu/3.3.6/../../../crt1.o:../sysdeps/i386/elf/start.S:65: first defined here
/usr/lib/gcc-lib/i486-linux-gnu/3.3.6/../../../crt1.o: In function `_start':
init.c:(.text+0x18): undefined reference to `main'
ccall.o: In function `_start':
: undefined reference to `test'
ccall.o: In function `_start':
: undefined reference to `test'
collect2: ld returned 1 exit status
make: *** [ccall] Fehler 1

hackbert
02-10-2005, 16:56
Hier noch die (äußerst) simplen Codedateien:

ccall.s

.section .data

.section .text
.globl _start
.extern test

_start:
call test

mov $1, %eax
mov $0, %ebx
int $0x80


und ccall.c

#include <stdio.h>

void test()
{
printf("test");
}

anda_skoa
02-10-2005, 17:57
Wenn das kein Tippfehler ist, hast du zweimal ccall.o statt einmal ccallc.o in deinem Makefile

Ciao,
_

hackbert
02-10-2005, 20:37
Wenn das kein Tippfehler ist, hast du zweimal ccall.o statt einmal ccallc.o in deinem Makefile

Ciao,
_
Hab's auch bemerkt. Hab's geändert und es geht immernoch nicht. Inzwischen kriege ich die umgekehrte Variante mit gcc als linker hin (umgekehrt i.S.v. c-file enthält main() und ruft Funktionen aus dem ASM-File auf). Irgendwie scheint ld die objektdateien nicht zu mögen. Kann es sein, dass gcc und as verschiedene Formate nutzen?

anda_skoa
02-10-2005, 22:19
Kann es sein, dass gcc und as verschiedene Formate nutzen?

Dann würde es ja umgekehrt nicht funktionieren. Ich denke eher, daß etwas gefehlt hat, was bei int main() generiert wird.

Ciao,
_

rais
03-10-2005, 17:48
Falls es denn was nützt:
wenn Du die _start Globale (ccall.s) in z.B. _starth umtaufst (und ich den call test auskommentier') dann funzt es soweit.
Wenn ich mich recht erinnere, wurde _start von gcc intern bei Aufruf von main definiert, deshalb die eine Fehlermeldung "multiple definition of _start"... und extern test gibt's bei mir nich (undef'd ref to "test"), deshalb den call erstmal auskommentiert.
Allerdings hab ich nicht erst ein makefile gabaut, vielmehr die cmd's zu Fuß abgeschickt (unter Berücksichtigung von #7), aber das sollte ja keine Rolle spielen - jedenfalls ist "ccall" anschließend aufrufbar

MfG,

Joghurt
03-10-2005, 19:50
Bei deinem allerersten beispiel linkst du mit -lc die libc dynamisch ein. Die wird jedoch nie geladen (normale dynamische Programme haben immer ein stub, das /lib/ld.so programm aufruft; aus demselben grund bringt ein noexec-mounten selten was, da man die Programme immer direkt mit ld.so laden kann) link die libc mal statisch hinzu.

Yonibear
05-10-2005, 23:14
Da du die _start - Funktion der Standardbibliothek überschreiben willst, musst du dem Linker -nostartfiles übergeben.