Frage

Ich mache wahrscheinlich etwas falsch, ein Neuling zu sein. Könnten Sie mir bitte helfen?

Ich habe ein einfaches Hallo Welt Programm in C geschrieben namens hello.c und lief den folgenden Befehl ein:

gcc -S hello.c

, die hello.s erzeugt. Dann habe ich die Datei mit GNU Assembler, as:

as hello.s

, die eine nicht-ausführbare a.out erzeugt, der muss noch verknüpft werden, verstehe ich?

Ich versuche, es zu verknüpfen, indem ld verwenden, etwa so:

ld a.out

Aber erhalten folgende Fehlermeldung:

a.out: file not recognized: File truncated

Und ld löscht meine Datei.

Dies ist ein x86 Ubuntu-System. Was mache ich falsch? Vielen Dank!

War es hilfreich?

Lösung

Meine erste Frage wäre: Warum sind Sie den Code zusammenbauen? Wenn Sie den Assembler-Code die, mit allen Mitteln wollen, verwenden Sie gcc -S es zu erhalten (zum Betrachten, glaube ich).

Aber Sie brauchen nicht, dass durch as laufen in Gang zu halten, benutzen Sie einfach:

gcc -o hello hello.c
gcc -S hello.c

Das erste Schritt wird die C-Quelle schalten direkt in eine ausführbare Datei, die zweite wird geben Sie Ihren Assembler-Quelle.

Ihr spezifisches Problem kann sein, dass ld versucht, seine Ausgabe an a.out zu schreiben. Wenn das auch Ihre Eingabedatei, kann es gut in dem Prozess werden wird ld laufen zerstört. Sie könnten versuchen, a.out vor dem Ausführen des ld Befehl a.in Umbenennung. ld a.in

Andere Tipps

Hier ist, wie ich es tun:

> gcc -S forums.c 
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums 
test

Warum rufe ich gcc statt ld? Da GCC nimmt die C-Laufzeit zu verknüpfen, und tun andere Implementierung abhängig Sachen. Wenn Sie das sehen wollen, verwenden Sie die Option --verbose:

> gcc --verbose forums.o -o forums
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC) 
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic'
 /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o

EDIT: Okay, habe ich versucht, das alles auf meinem System, und ich glaube, ich weiß, was das Problem ist. ld schreibt (die Standardausgabedatei) a.out, während von ihm zur gleichen Zeit mit dem Lesen. Probieren Sie etwas wie folgt aus:

ld a.out -o myprog

neu installieren glibc-devel sowieso Sie können und überprüfen, ob es funktioniert. dieser Prozess für mich arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top