2017-12-07 19 views
0

소켓 기능을 사용하여 간단한 서버 프로그램을 작성했습니다. g++으로 컴파일하면 send, __xnet_socket, 수신 대기, __xnet_bind에 대해 정의되지 않은 기호 오류가 발생합니다.솔라리스에서 g ++로 컴파일하면 dlsym()을 사용하여 socket() 및 bind()가 인터셉트되지 않습니다.

왜 소켓과 바인드 기호가 다른 기호와 다른가요? 또한 gcc을 사용하여 프로그램을 컴파일하면이 'xnet'의 차이가 발생하지 않습니다. 이 연결 오류는 libsocket.so (으)로 연결될 때 발생합니다.

사실,이 소켓 API를 오버로드하고이를 dlsym()을 사용하여 차단하는 공유 라이브러리를 작성 중입니다. Solaris에서이 라이브러리를 gcc로 컴파일하면이 호출이 라이브러리를 거치지 만 g++으로 컴파일하면 socket()bind() 호출은 가로채는 것이 아니라 다른 모든 apis가 라이브러리를 통과합니다.

libxnet.so이 작업을 수행 하시겠습니까? dtrace가 도움이 될 수 있습니까?

+1

* g ++로 컴파일하면 send, __xnet_socket, listen, accept, __xnet_bind에 대해 정의되지 않은 기호 오류가 발생합니다. * '-lxnet'과 연결되어 있지 않은 것처럼 들립니다. 링크 명령 [s]을 게시하십시오. –

답변

0

링커가 해당 기능을 선택하려면 libsocket (-lsocket 통해)과 연결해야합니다. libxnet은 11.3의 필터 라이브러리입니다. 기능은 libxnet에서 libsocket, libnsl 및 libc로 옮겨졌습니다.

Solaris에서 OSS를 빌드 할 때 LDLIBS에 -lsocket -lnsl을 추가하면 일반적으로 구성 및 빌드 단계를 거쳐 쉽게 알 수 있습니다. 링커는 출력에서 ​​불필요한 참조를 제거 할만큼 똑똑합니다.