Linux에서 만든 프로그램을 BSD에서도 그대로 실행 할수 있나요?
글쓴이: miso / 작성시간: 월, 2003/03/10 - 11:32오전
제가 Linux에서 서버를 하나 만들었는데....
좀 불안한 것 같아서.. BSD를 깔어서 테스트를 한번 해 볼려고 하는데...
(얘기를 들어보니까 BSD가 더 안정적이라고 해서요....)
그런데...서버에서 pthread를 쓰거든요... BSD에서도 그대로 실행해서 돌려도 되나요?..
제가 알아 본 봐로는 BSD에서 실행을 시키려면....
아마 다시 컴파일해야 한다고하는데...
제가 서버에서 pthread를 쓰는데.. BSD에서도 pthread를 그대로 쓸 수 있는지와 만약에 pthread를 쓸 수 없다면.... pthread대신 무엇을 써야하는지 좀 알려주세요....
그리고 BSD에서 컴파일하는 방법도 알려주세요.... ^^;;;
Forums:
[답변]Linux에서 만든 프로그램을 BSD에서도 그대로 실행 할수
Linux에서 개발한 프로그램을 BSD에서 사용할 수 있습니다.
단. pthread 부분이 gcc에서 지원하는 부분이 아닌 경우에는
해당 소스를 받아서 BSD에서 컴파일해서 사용하시면 됩니다.
사용하신 pthread부분에 대해서 기본적으로 BSD에서
지원하는 확인하셔야 해야 합니다.
그럼.
엄밀히 말하면, BSD(FreeBSD의 경우)에서는 리눅스용 프로그램(바
엄밀히 말하면, BSD(FreeBSD의 경우)에서는 리눅스용 프로그램(바이너리)을 에뮬레이션합니다. 그래서 굳이 컴파일 하지않아도, 바이너리 호환이 됩니다.
BSD는 이러한 에뮬레이션을 해주는 포트들이 있죠. :lol:
프로그램이 불안하다면, 가장 먼저 자신의 소스 코드를 들여다 보아야 할
프로그램이 불안하다면, 가장 먼저 자신의 소스 코드를 들여다 보아야 할 것입니다.
단순히 운영체제가 바뀐다고 문제가 잘 해결되는 것도 아닐 뿐더러, 만약 해결된다해도 무엇이 문제 인지 모른다면, 아무런 의미가 없는 것입니다.
원인을 분석하시고 거기에 맞춰서 대응하시는 것이 본인에게 큰 도움이 될 것이라고 생각됩니다. :)
그리고 BSD에서도 리눅스에서와 마찬가지로 컴파일 하시면 됩니다. 다만 make의 버전이 다르니, 리눅스와 같은 make를 사용하고 싶으시면, gmake를 설치하시면 됩니다.
pthread, gmake모두 포트에 존재합니다.
제가 알고 싶은 것은....
제가 알고 싶은 것은요...
제가 만든 서버가 문제 있는것 이 아니고....
linux 보다 BSD가 더 안정적이라고 해서 그쪽에서 테스트 하려고 하는데요..
제 프로그램에서 pthread를 쓰는데... 혹시 bsd에서는 지원하지 않는지.. 그것이 궁금한 것입니다.
그리고 설명하신 것 중에 포트가 무엇인가요?
혹시 포트번호를 말씀하시는 것인지....
linux에서 pthread의 위치가 /usr/include/pthread라는 곳에 있는데...
이 위치를 말씀하시는 것인지...
좀 이해가 안가거든요..... ^^;;;
*^^*
FreeBSD와 같은 BSD계열에서 사용하는 패키지 관리 방법이 port
FreeBSD와 같은 BSD계열에서 사용하는 패키지 관리 방법이 port 입니다.
http//www.kr.freebsd.org 에서 찾아보시면,
자세한 내용을 찾으실 수 있을 것으로 생각됩니다.
답변 정말 감사합니다.
dyaus님 답변 정말 감사합니다.
많은 참고가 될 것 같습니다.
그리고 이전에 답변해 주신 분들도 감사드립니다.
*^^*
FreeBSD/NetBSD 등은 리눅스 커널 시스템 콜과 실행 파일 포맷
FreeBSD/NetBSD 등은 리눅스 커널 시스템 콜과 실행 파일 포맷을 적절히 변환해서 BSD kernel 상에서 실행할 수 있도록 하는 시스템을 갖고 있습니다. 간단히 말하면 에뮬레이션인데, vmware같은것이 아니라 cygwin이랑 유사한 관계라고 생각하시면 되겠지만 기본적으로 유닉스이기 때문에 변환에 필요한 오버헤드는 매우 낮습니다.
그리고 패키징 시스템을 통해(FreeBSD: ports, NetBSD: pkgsrc) 리눅스 유명 배포본(FreeBSD: redhat, NetBSD: suse?)의 기본 패키지들을 BSD 시스템 위에 설치할 수 있고, 이를 통해서 마치 리눅스 상에서 실행되는 것 처럼 프로그램을 그대로 실행할 수 있습니다. FreeBSD의 경우 linux_base-7.1 포트를 사용하시면 /compat/linux 아래에 redhat 7.1에서 기본 실행 환경만을 추출하여 설치합니다. 리눅스 바이너리(magic number로 구분할 수 있으므로)는 /compat/linux 아래에서 먼저 파일을 검색하고 없으면 원래 파일시스템에서 찾습니다. (e.g. /etc/ld.so.conf는 /compat/linux/etc/ld.so.conf를 먼저 찾고 없으면 /etc/ld.so.conf를 찾는 식) 이렇게 하여 한 시스템에서 두 OS의 바이너리가 공존할 수 있도록(실제 FreeBSD와 NetBSD는 리눅스 이외에도 Solaris x86이나 Digital UNIX, IRIX등의 에뮬레이션을 같은 방법으로 제공합니다) 합니다.
에뮬레이션 가능한 범위는 대략 커널 드라이버 수준 이외의 거의 모든 것들로, (최근의 경우 linux 2.4.x의 시스템 콜을 에뮬레이션합니다) XFree86도 가능하고 Oracle, vmware, sybase, netscape, mozilla 같이 상당히 규모 있는 어플리케이션도 에뮬레이션 레이어 위에서 동작할 수 있습니다. 단 스레드 지원의 경우 확실하지 않은 부분이 있으므로 실제 FreeBSD상에서 linux_base 패키지와 linux 에뮬레이션을 켜놓은 상태에서(/stand/sysinstall에서 제어할 수 있습니다) 실행해 보시면 실행 가능 여부를 알 수 있습니다.
하지만 소스가 있다면 소스를 통해 다시 빌드하는 것이 가장 좋습니다. pthread의 경우 FreeBSD에서는 libc_r이라는 라이브러리를 통해 지원하고 있고, 리눅스 glibc의 스레드 시스템의 포팅인 devel/linuxthreads 포트, GNU portable threads의 포팅인 devel/pth 등이 따로 있으므로 적절한 것을 선택하시면 됩니다. 컴파일할 때 -lc_r같이 링크하는 대신
gcc -pthread xxx.c...
같이 -pthread 플래그를 주어 컴파일/빌드하시면 자동적으로 필요한 C preprocessor 정의와 라이브러리가 링크됩니다. 이건 libc_r을 사용하는 경우이고 linuxthreads 포트를 사용하신다면 그 라이브러리를 링크해야 할 겁니다.
그외 주의하실 것은 다른 분이 말씀하셨듯이 리눅스는 GNU make가 기본 make이지만 FreeBSD는 BSD pmake의 변종이므로 Makefile문법이 약간 다를 수 있으므로 gmake 패키지를 설치하고 그걸로 빌드하는 편이 더 안전합니다.
자세한 것은 FreeBSD의 pthread(3) 매뉴얼 페이지를 보세요. 기본 시스템에 들어 있고 http://www.kr.freebsd.org의 매뉴얼 페이지 서비스에서도 온라인으로 볼 수 있습니다.
--
익스펙토 페트로눔
댓글 달기