"файл не распознан" при использовании компоновщика GNU - PullRequest
7 голосов
/ 20 мая 2009

Я, вероятно, делаю что-то не так, будучи новичком. Не могли бы вы помочь мне?

Я написал простую программу Hello World на C под названием hello.c и выполнил следующую команду:

gcc -S hello.c

Это произвело hello.s. Затем я использовал этот файл с ассемблером GNU, as:

as hello.s

Который дал неисполнимый a.out, который все еще нужно связать, я так понимаю?

Я пытаюсь связать его, используя ld, вот так:

ld a.out

Но получите следующую ошибку:

a.out: file not recognized: File truncated

И ld удаляет мой файл.

Это система x86 Ubuntu. Что я делаю неправильно? Большое спасибо!

Ответы [ 4 ]

6 голосов
/ 20 мая 2009

Мой первый вопрос: зачем ты собираешь код? Если вам нужен ассемблерный код, во что бы то ни стало, используйте gcc -S для его получения (я думаю, для просмотра).

Но вам не нужно проходить через as, чтобы продолжить, просто используйте:

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

Этот первый шаг превратит источник C непосредственно в исполняемый файл, а второй даст вам ваш ассемблерный источник.

Ваша конкретная проблема может заключаться в том, что ld пытается записать свой вывод в a.out. Если это также ваш входной файл, он может быть уничтожен в процессе выполнения ld. Вы можете попробовать переименовать a.out в a.in перед запуском команды ld: ld a.in.

5 голосов
/ 20 мая 2009

Вот как я это делаю:

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

Почему я вызываю gcc вместо ld? Потому что GCC заботится о связывании среды выполнения C и делает другие вещи, зависящие от реализации. Если вы хотите это увидеть, используйте опцию --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
3 голосов
/ 20 мая 2009

РЕДАКТИРОВАТЬ: хорошо, я попробовал все это на моей системе, и я думаю, что я знаю, в чем проблема. ld записывает в a.out (его файл вывода по умолчанию), одновременно читая из него. Попробуйте что-то вроде этого:

ld a.out -o myprog
1 голос
/ 06 января 2012

переустановите glibc-devel в любом случае и проверьте, работает ли он. этот процесс работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...