문제

나는 아마도 뭔가 잘못하고 있고, 초보자 일 것입니다. 제발 도와 주시겠습니까?

나는 C에서 Hello.c라는 간단한 Hello World 프로그램을 작성했으며 다음 명령을 실행했습니다.

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 우분투 시스템입니다. 내가 뭘 잘못하고 있죠? 많은 감사합니다!

도움이 되었습니까?

해결책

첫 번째 질문은 다음과 같습니다. 왜 코드를 조립하고 있습니까? 어셈블러 코드를 원한다면 반드시 사용하십시오. 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.

다른 팁

내가하는 방법은 다음과 같습니다.

> 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

편집 : 좋아, 나는 이것을 내 시스템에서 시도했는데 문제가 무엇인지 알고 있다고 생각한다. ld 글을 쓰고 있습니다 a.out (기본 출력 파일) 동시에 읽는 동안. 다음과 같은 것을 시도하십시오.

ld a.out -o myprog

어쨌든 glibc-devel을 다시 설치하고 그것이 작동하는지 확인하십시오. 이 과정은 저에게 효과적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top