2016-06-14 2 views
4

는 다음 C 프로그램을 가지고 : 그것은 C 표준 라이브러리에서 아무것도를 사용하지 않을 것프로그램을 연결하는 데 stdlib가 필요한 이유는 무엇입니까?

int main(){} 

.
-nostdlib을 통해 연결을 해제 할 수 있다고 가정했습니다.

그러나, 다음과 같은 오류가 발생합니다

$ gcc -nostdlib -o main main.c 
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400150 

사람이 _start 상징이고 누가 그것을 제공 할 책임이 무엇인지 명확히 할 수 있습니까?
-nostdlib을 사용하면 어떻게 될까요? 워드 프로세서 당


는, 나는 또한 시도 :

$ gcc -nostdlib -o main main.c -lgcc 

같은 행동은 그 소리와 함께 볼 수있다.

+1

먼저주의해야 할 것은 * 링커 * 오류입니다. 컴파일에 실패 했다는 의미는 아닙니다. – Dmitri

+0

@Dmitri 예, 제목을 수정하겠습니다. –

+2

'-lgcc'가 끝나야합니다. Gcc는 라이브러리가 만나는 지점에서 라이브러리를 처리하므로 이전에 언급 한 객체의 심볼을 확인하는 데만 사용됩니다. – rici

답변

1

_start은 프로그램의 시작점입니다 (cf. this answer. libc에는 운영 체제에서 명령 줄 인수를 읽은 작은 따옴표가 들어 있으며 main을 호출합니다. 따라서 일반 플랫폼에서 정상적인 C 프로그램을 실행하려면 libc에 링크해야합니다.

libc없이 프로그램을 작성하려고 할 수 있지만 직접 제공하려면 _start을 제공해야합니다. 당신은 많이 할 수는 없지만 돌아 오는 일이 없기 때문에 돌아올 수는 없습니다. 유일한 옵션은 어셈블리를 사용하여 _exit 함수와 같이 필요한 libc 부분을 고심하게 다시 만드는 것입니다.

+2

"따라서 C 프로그램을 실행하려면 libc에 링크해야합니다." - 미안하지만 그건 틀린 말이야! 필요한 경우 환경에 따라 다릅니다. 대부분의 임베디드 시스템에는 링크가없는 표준 라이브러리도 없습니다. – Olaf

+0

@Olaf C 표준 라이브러리가없는 임베디드 시스템은 표준을 준수하지 않습니다. 어쨌든, 나는 대답을 약간 바꾸어 말했습니다. 이게 너에게 받아 들여질 수 있니? – fuz

+1

솔직히 내 임베디드 코드가 "보통의 C 프로그램"이라고 생각합니다. 실제로 표준에서 해당 용어를 찾지 마십시오. – Olaf

관련 문제