ARM 용 toolchain 을 깔았는데, 소켓 함수가 없네요.
글쓴이: sauron / 작성시간: 수, 2011/11/09 - 9:32오후
ARM linux 에서 동작하는 임베디드 C/C++ 프로그램을 하게 되었읍니다.
그런데 ELDK 4.0 과 www.gnuarm.com 에서 제공하는 toolchain 을 깔았읍니다.
그런데 깔고 나서 보니까 소켓 함수를 쓸려고 보니까, 소켓 헤더 파일이 없는 거에요.
너무 당황스러운데, 원래 ARM 임베디드에서는 이렇게 소켓 헤더 파일이 없나요.
그렇다면 소켓을 사용하고 싶을 때에는 어떻게 해야 하나요. glibc 소스를 가져다가
설치한 ARM 용 toolchain 으로 다시 컴파일을 해줘야 하나요.
Forums:
제가 알기로는 툴채인을 살펴보시면 newlib를 쓴
제가 알기로는 툴채인을 살펴보시면 newlib를 쓴 것인지, ulibc를 썼는지, 안드로이드 계열의 bionic을 썼는지 다를겁니다.
쓰시는 시스템이 무슨 libc를 쓰고 있는지를 먼저 살펴보시고, 해당 libc에 맞는 include나 *.so를 맞게 세팅하셔야 할 듯.
-- 제가 알기로는 툴채인을 살펴보시면 newlib를
-- 제가 알기로는 툴채인을 살펴보시면 newlib를 쓴 것인지, ulibc를 썼는지, 안드로이드 계열의 bionic을 썼는지 다를겁니다.
-- 쓰시는 시스템이 무슨 libc를 쓰고 있는지를 먼저 살펴보시고, 해당 libc에 맞는 include나 *.so를 맞게 세팅하셔야 할 듯.
ELDK 자체 라이브러리와 (gnuarm 의)newlib 를 사용했읍니다. 그런데 socket.h 파일 자체가 없는 거에요. *.so 파일도 없구요.
도대체 임베디드 환경에서 소켓을 프로그램을 하는 분들은 어떻게 하시는지 궁급합니다. glibc 를 다시 설치해서 사용하시나요.
그러니까 제 말뜻은 단순히 툴채인 설치하면
그러니까 제 말뜻은 단순히 툴채인 설치하면 stdio.h 조차도 안들어있는 경우가 있습니다.
이것은 그냥 툴채인만 들어있는 것입니다. newlib를 따로 설치하셔야 하죠.
-- 그러니까 제 말뜻은 단순히 툴채인 설치하면
-- 그러니까 제 말뜻은 단순히 툴채인 설치하면 stdio.h 조차도 안들어있는 경우가 있습니다.
-- 이것은 그냥 툴채인만 들어있는 것입니다. newlib를 따로 설치하셔야 하죠.
newlib 를 사용했다고 이미 적었읍니다. 즉 설치했다는 것이구요. 그런데도 소켓 헤더파일 socket.h 이 없어서, 소켓 프로그래밍을 할 수 없다는 것이죠.
제가 newlib를 사용해본적은 없지만newlib의
제가 newlib를 사용해본적은 없지만
newlib의 홈페이지에 있는 문서에 의하면
socket.h는 없습니다.
http://www.sourceware.org/newlib/
의 doc 링크를 눌러보세요.
참고로, socket()은 표준C라이브러리에 존재하지 않는, POSIX specification에만 존재하는 함수입니다.
pthread (POSIX thread)도 표준C라이브러리의 일부분이 전혀 아니죠.
glibc는 그냥 표준C라이브러리만의 구현물이 아닙니다.
POSIX speicification에서 정의하는 거의 모든 부분을 구현하며
리눅스같이 특정 OS에만 제공하는 시스템콜의 wrapper도 제공합니다.
하지만.
newlib는 정말 표준C라이브러리만 구현했으며,
POSIX specification은 정말 최소한의 부분들만 구현해놓은듯 싶습니다. ( 가령, fork(), popen() )
즉, 그냥.....표준C라이브러리에서 조금 몇몇만 추가한정도이며,
glibc에서 제공하는 방대한 양의 API들은 거진 제공을 안하는 듯 싶네요.
당연히 select()/poll()도 없으며, socket(), bind(), listen() 아무것도 없으며
pthread_create(), pthread_exit(), pthread_mutex(), 기타등등 아무것도 없습니다 ( 사실, 이넘들은 표준C라이브러리의 일부분이 아니죠. )
결론은..
그냥 glibc 쓰세요.
아님, 직접 리눅스 시스템 헤더파일들만 커널소스에서 추려내서
설치하시고, 직접 시스템 콜을 호출하셔야합니다. ( 사실, 이게 glibc가 하는일이기도 합니다. )
아님, 프로그램을
정말 표준C라이브러리만을 이용해 작성하시던지;;;;;( printf, fopen, fclose, scanf로 모든 입/출력 해결을;;; )
-- newlib는 정말 표준C라이브러리만
-- newlib는 정말 표준C라이브러리만 구현했으며,
-- POSIX specification은 정말 최소한의 부분들만 구현해놓은듯 싶습니다.
-- ( 가령, fork(), popen() )
-- 그냥 glibc 쓰세요.
-- 아님, 직접 리눅스 시스템 헤더파일들만 커널소스에서 추려내서
-- 설치하시고, 직접 시스템 콜을 호출하셔야합니다. ( 사실, 이게 glibc가 하는일이기도 합니다. )
아, 네 명쾌하게 정리해주셨네요. 초보자한테는 안되는 것은 확실하게 안된다고 얘기를 듣는 것도
큰 도움이 됩니다. 앞으로 glibc 가지고 샆질 좀 해야겠네요. 고견 감사합니다.
답변에 만족하셨으면, [완료] 말머리를;;;;;
답변에 만족하셨으면, [완료] 말머리를;;;;; :D
댓글 달기