2013-07-27 3 views
1

우연히, hello world C++ 프로그램과 --shared 플래그로 링크되어 있고 exe 파일이 있습니다. 출력은 segfault입니다. 누군가 그 뒤에 이유를 말해 줄 수 있습니까?C++ 공유 플래그 segfault

방법은 재현 : 이클립스 C의

표준 C++ 안녕하세요 세계 문제 ++. -> 공유 라이브러리 설정을 설정하여 공유 플래그 상자를 확인하십시오.

빌드 출력 :

하는 모든 건물 파일 : ../app.cpp 호출하기 : GCC C++ 컴파일러 g ++ -O0 -g3 -Wall -c -fmessage 길이 = 0 -fPIC -MMD - MP -MF "app.d"-MT "app.d"을 "app.o" "../app.cpp" 완료 건물 -o : ../app.cpp

건물의 목표 : 응용 프로그램 호출하기 : GCC C++ 링커 g ++
완료 건물 대상 ./app.o -shared -o "응용 프로그램": 응용 프로그램

,

실행 출력 : 세그먼트 오류

감사 g에서

+0

실행 파일이 아니라 공유 라이브러리를 빌드했습니다. 공유 라이브러리를 실행하려고하면 일반적으로 분할 오류가 발생합니다. 공유 라이브러리를 만들고 싶지 않으면'-shared'를 사용하지 마십시오. –

+0

왜 공유 라이브러리를 실행하면 segFault가 발생할 수 있는지 말해 줄 수 있습니까? 감사합니다 – cppython

+0

@cppython 공유 라이브러리는 엔트리 포인트 (함수 메인)를 필요로하지 않으므로 시스템은 코드에서 실행을 시작할 위치를 알 수 없습니다. 또한 main()을 호출하고 main()이 반환하면 exit()를 호출하는 C 런타임 코드의 실행 가능 링크. –

답변

5

++ 매뉴얼 : --shared 다음 실행을 형성하기 위해 다른 객체와 링크 될 수있는 공유 객체를 생성합니다. 모든 시스템이이 옵션을 지원하는 것은 아닙니다. 예측 가능한 결과를 얻으려면이 옵션을 지정할 때 코드 생성에 사용 된 것과 동일한 옵션 세트 (-fpic, -fPIC 또는 모델 하위 옵션)도 지정해야합니다. [1]

--shared 옵션을 넣으면 실행 파일은 필요 없지만 공유 개체는 필요하다는 의미입니다.

귀하의 경우, 귀하는 실행 파일이 아닌 공유 라이브러리를 생성합니다. 이것은 당신이 당신의 발사 때 segfault 이유입니다.

+0

따라서, (.so 또는 .dll) 파일을 빌드하기 위해 -shared 플래그를 추가해야합니다. 권리? – cppython

+0

.so 및 .dll 파일은 모두 공유 라이브러리입니다. .so는 유닉스에서는, .dll은 윈도우에서 사용된다. – Joyas