2017-12-08 3 views
1

저는 Assembly in x86에서 프로그래밍을 시작하고 있습니다. 저는 리눅스 가상 머신에서 가스를 사용하여 컴파일하고 있습니다.x86 linux에서 gas를 사용하는 어셈블리 : 'main'의 다중 정의

메인 루틴이 프로그램을 즉시 종료하는 간단한 빈 프로그램을 실행하려고합니다. 이것이 제가 따라하는 가이드의 첫 번째 임무입니다. 내 코드는 파일 hello.s에 저장하고이처럼 보이는 :

gcc -o hello.o hello.s -no-pie ./hello.s 

I을 : 나는 파일의 디렉토리로 이동하여 다음과 같이 그것을 실행하려고 터미널에서

.global main 

main: 
    movq %rsp, %rbp 
    mov $0, %rdi 
    call exit 

오류 메시지가 표시됩니다.

/tmp/cc62hr1F.o: In function 'main': 
(.text+0x0): multiple definition of 'main' 
/tmp/ccwMutY1.o(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 

이 오류의 의미는 무엇이며이를 수정하는 방법은 무엇입니까? 미리 감사드립니다.

+0

글쎄, 나는 그 문법의 팬이 아니기 때문에 나는 가스를 사용하지 않고 속도를 최대화 할 수는 없지만 잠재적으로 2 주요 레이블이 있습니다 ... 그 중 하나를 제거하면 어떻게됩니까? –

+3

문제는 컴파일러에'hello.s'를 두 번 전달하여 두 번 어셈블하고 두 번 사용하여 바이너리를 생성하여 관찰 한 중복 심볼 오류가 발생한다는 것입니다. – fuz

답변

1

EDIT/SOLUTION : 무엇이 잘못되었는지 알아 냈습니다. 터미널에서는 다음과 같이 실행해야합니다.

gcc -o hello.o hello.s -no-pie 
./hello.o 

다음은 두 가지 별도의 명령입니다. 나는 한 줄에 그것들을 썼다. 그리고 실행 파일은 .o가 아닌 확장자를 가져야합니다 .s.

+3

Linux/UNIX에서 실행 파일에는 일반적으로 파일 확장명이 없습니다. 그래서'gcc -o hello -no-pie hello.s' (또한, 피연산자 앞의 옵션이 더 정확할 것입니다)가 더 정확할 것입니다. 접미사가 붙은'.o' 파일은 실행되기 전에 링크되어야하는 * object files *입니다. – fuz

+0

확실히 .o 파일을 .o ('-c'는 C 소스를위한 것이고, 너무 게으르다 .s도 작동합니다.) 파일을 얻는 옵션은 있지만, 전체 코드가 .s 파일에 있다면, 'gcc '가 바이너리를 직접 빌드하도록 할 수도있다. 바이너리 이름에'.o'를 사용하지 마십시오. '-o '옵션을 사용하여 자신의 것을 지정하지 않는 한, 기본 이진 이름은'a.out'입니다. – Ped7g