0

내 문제는 공유 라이브러리와 정적 라이브러리에 대한 지식이 부족하기 때문에 다소 문제가 될 수 있습니다.세그먼트 화 오류 프로그램이 공유 라이브러리로 컴파일되었지만 정적이 아닙니다.

저는 앞으로 infiniband를 학습/실습으로 사용하여 서버/클라이언트 시스템에서 작업하고 있습니다. 원래 2 개의 실행 파일이 있었는데, 각 파일에는 동일한 소스 코드가 포함되어 있으므로 헤더 파일과 함께 RDMAConnectionManager.cpp 및 RDMAConnection.cpp 인 공용 파일로 분할했습니다.

줄을 따라 나는 그 파일들이 라이브러리가되기를 바랬다. 그래서 내 서버와 클라이언트가 동일한 하위 레벨 코드를 사용할 수 있도록했다. 저는 항상 공유 라이브러리를 사용 했으므로 cmake를 통해 공유 라이브러리를 만드는 표준에 따라 일을 진행했습니다.

문제는 최대한 빨리이 그랬던 것처럼 내가 ib_verbs 기능 구체적으로, 라이브러리 rdmacm에서 제공하는 기능에 세그먼트 오류를 ​​얻을 것이었다. 나는 그것이 질서를 연결하는 것과 관련이 있다고 생각했지만 도움을 바꾼 것은 아무것도 없었다.

변덕스럽게 나는 SHARED 라이브러리에서 STATIC 라이브러리로 변경했습니다. 이것은 완벽하게 작동했습니다! 정적에 대한 나의 이해는 그것이 링크 된 라이브러리의 모든 심볼을 포함하는 반면 링크 된 라이브러리의 모든 심볼을 포함한다는 것입니다. 그러나 이제 나는이 곤란한 문제를 발견했다. 나는 뭔가를 놓치고있는 것처럼 느낀다.

나는 그 이후로 더 많은 독서를했으며 차이점에 대해 더 편안하다고 느꼈지만, 여전히이 문제의 원인 (또는 앞으로 어떻게 될지)을 알지 못합니다. 누군가 이런 일이 일어날 수있는 이유를 알고 있습니까?

+0

완벽하게 작동하지 않았습니다. 당신은 세그 폴트를 위장한 물건들을 움직 였지만 여전히 거기에 있습니다. 공유 라이브러리는 50 년 전부터 사용되어 왔습니다. RDMA는 10 년 동안 사용되었습니다. 귀하의 코드는 2 일 동안 사용되었습니다. 오캄의 면도날은 무엇을 말합니까? – stark

+0

아마도'ldd'를 사용하여 실제로 사용하고 있다고 예상되는 동적 라이브러리를 사용하고 있는지 확인할 수 있습니다. –

답변

0

SegFault의 원인을 분명히해야합니다. 예를 들어 gdb로 프로그램을 실행하고 segfault가 발생한 위치를 식별해야합니다. 많은 경우에 메모리 오류가있을 수 있습니다. 메모리 오류는 원시 응용 프로그램의 매우 일반적인 문제이므로 피해야합니다. 그러나 몇 가지 조건에서 메모리 오류가 SegFault를 표시하는 방법을 물어보십시오. 대답은 프로그램의 메모리 매핑에 관한 것입니다. 코드를 변경 (추가 또는 삭제)하거나 다른 컴파일러에서 컴파일하거나 다른 스위치로 컴파일하면 다른 메모리 맵을 얻을 수 있습니다. 예를 들어 디버그 또는 릴리스 빌드 또는 상황에 따라 공유 또는 정적 빌드가 생성 된 바이너리 파일의 메모리 매핑이 다를 수 있습니다.

그래서 어떻게 서로 다른 메모리 매핑이 SegFault를 유발합니까? 바운드 액세스, 유효하지 않은 쓰기 또는 유효하지 않은 읽기와 같이 코드에 메모리 문제가있는 경우 바이너리의 메모리 맵에 따라 SegFault가 생성 될 수도 있고 그렇지 않을 수도 있습니다. 실제로는 버퍼 용 영역에서 바이트를 액세스했지만 갑자기 이 아웃 액세스는 예약 한 다른 버퍼 또는 메모리 영역으로 떨어지며 SegFaults가 보이지 않습니다 (코드에 여전히 문제가 있음). 다른 빌드를 사용하면 메모리 영역 또는 메모리 매핑 순서가 변경 될 수 있으므로 SegFault가 다른 빌드에있는 이유입니다.