gcc버전을 바꿨더니 컴파일이 되지 않는군요...
프로그램을 Redhat 9상에서 이상없이 컴파일되던 코드였는데
Ubuntu 6.10에서는 컴파일이 되지 않는군요...
컴파일러 버전 때문인지 아니면 다른 문제인지 모르겠네요
이거 저거 다 빼고 문제가 되는 코드만 보자면 다음과 같습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <linux/unistd.h> _syscall0(pid_t,gettid); int main(void) { printf("Start Main!! %d\n",gettid()); return 0; }
컴파일을 하면 다음과 같은 에러가 발생하더군요.
test1.c:8: error: expected declaration specifiers or ‘...’ before ‘gettid’ test1.c:8: warning: data definition has no type or storage class
아래는 이때 사용한 컴파일러 버전입니다.(gcc 4.1및 3.3모두 안되네요)
--------------------------------------------- gcc 4.1
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)
--------------------------------------------- gcc 3.3
Reading specs from /usr/lib/gcc-lib/i486-linux-gnu/3.3.6/specs
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --enable-__cxa_atexit --with-system-zlib --enable-nls --without-included-gettext --enable-clocale=gnu --enable-debug i486-linux-gnu
Thread model: posix
gcc version 3.3.6 (Ubuntu 1:3.3.6-13ubuntu2)
----------------------------------------------
Redhat 9.0에 설치되어 있는 gcc 버전입니다.
[admin@sipserver admin]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
C99 Extension을 지원하지 않는게...
GCC old version들이 C99 Extension/GNU Extension같은 걸 지원하지 않는게 아닐까요?
/***************************************
Being the one is just like being in love.
***************************************/
그럴리가...
그럴리가...
설령 그렇다고 하더라도
gcc-3.2.X에서는 컴파일 되던것이 gcc-3.3.X및 gcc-4.X에서 안되는 것을 설명해 주지는 못할 것 같습니다.
구글을 뒤져보면 나와 비슷한 증상의 글들이 몇개 보이긴 하던데...
제 짧은 영어실력을 가지고 해석해 보았을때는 별다는 해결책이 없었습니다.
그나마 도움이 될만한 것으로는 pthread_self()로 대체하라는 정도더군요..
뭐 안되면 그렇게라도 해야죠... ^^;;
답장 감사드립니다.
아 버전이 오히려 높군요~
아 버전이 오히려 높군요~ 전 그 반대로 알았습니다
ㅡ.ㅡ;
/***************************************
Being the one is just like being in love.
***************************************/
unistd.h 에 _syscall 매크로를 찾아보시죠??
냉무~~
컴파일이 되었습니다.
Ubuntu 6.10에서는 결국 포기하였습니다.
말씀하신 unistd.h 안에 _syscall 매크로가 포함된 곳은 이전에도 찾아보았지만 gettid는 있었던 것으로 기억합니다. 우분투 포럼에도 비슷한 내용이 있었는데 특별한 답글은 보이지 않았습니다.
본래 Ubuntu 6.10은 제 개인용도로 사용하고 있었고 실질적으로는
RHEL 4상에서 정상적으로 컴파일이 되면 되는 것이었는데...
RHEL 4에서는 별다른 수정없이 바로 컴파일이 되더군요.
기억에는 gcc 버전이 3.4.4에 레드햇 버전이었습니다.
우분투에서 컴파일이 안되는 이유는 include상의 문제 때문이었을 까요?
오래전 이야기지만 추가해야할 내용이 있어서 씁니다.
제가 오래전에 올린 글이지만 추가할 내용이 있군요
좀전에 확인한 결과
RHEL과 달리 Ubuntu에서는 /usr/include/unistd.h에 gettid가 extern되어 있지 않더군요..
다만 asm-i386/unistd.h 에 __NR_gettid 는 정의 되어 있어서
syscall을 이용해서 gettid를 호출할 수는 있습니다.
참고하시길 바랍니다.
저도 비슷한 경험을 하고 있는 중입니다.
제가 조금 살펴본 바로는요 ,,,
원래 /include/asm/아래에 있는 unistd.h에
_syscall0 ~ _syscall6 까지 Macro function이 정의 되어 있는 것 같은데..
이것이 Kernel Version 2.6.20 으로 오면서는 이 Macro function이 모두
사라져 버렸네요 ...
Error 가 발생하던 제가 만든 Code 바로 위에 예전과 같은 내용의
_syscallx macro function 을 copy해서 넣으면 error가 없어지는 것 같습니다.
하지만 이렇게 하는게 올바른 해결책 같지 않아서,,더 찾아보고 있는데,,
System Call을 등록하는 절차를 잘 이해하지 못해서 인지,,계속 시간을 허비하고 있네요.
이문제에 대해서 경험이 있으신 분의 설명을 더 들어보고 싶습니다.
댓글 달기