2014-02-26 4 views
0

내가 구축 한 서버에 대한 무언가가 고장났습니다 (나는 그것을 사용하는 유일한 사람이 아닙니다 ...). SLES 11 (SP가 없음)입니다. gcc, glibc 등을 제거하고 다시 설치해 보았습니다. 성공하지 못했습니다.세분화 오류를 일으키는 Glibc 링크 차이점

문제는 memset 또는 strlen과 같은 라이브러리 함수에 도달하자마자 내 빌드 된 프로그램 seg-faults입니다 (함수 자체가 아니라 매개 변수 자체가 아니라이 함수를 호출 함). 분명히 잘못 연결되었다고 생각합니다. 그리고 그것은 그것이 독자와 어떻게 다른지를 증명할 수 있습니다. 예를 들면 :

69: 00000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.0 (2) 
    2035: 00000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.0 

그것의 매우 표준 메이크 아무것도가 변경되었습니다 말한다 이전 작업 버전 대

# readelf -s myprog | grep memset 
    247: 081461d0 52 <OS specific>: 10 GLOBAL DEFAULT 27 [email protected]_2.0 (3) 
    3530: 081461d0 52 <OS specific>: 10 GLOBAL DEFAULT 27 [email protected]@GLIBC_2.0 

. 링커 플래그는 다음과 같습니다 당신의 glibc는 정말이 부팅 할 때 혹시 쉘에 도달하지 않을 고장 인 경우

LDFLAGS = -L$(companylibrarypath) -lourcompanylibrary -L$(mysql_lib_path) -lmysqlclient -L/usr/tls/ -lpthread -pthread -lz -L$(curl_lib_path) -lcurl -lxslt 
+1

처음부터 다시 작성하십시오. 오래된 개체 파일 일 수 있습니다 ... –

+0

나는 그것을 시도했습니다. 또한 printf와 memset만으로 새로운 프로그램을 만들었습니다. memset은 똑같은 문제가 있습니다 ... – user3194963

+0

@ user3194963 아주 단순한 프로그램 일지라도 그 프로그램의 버그가 아니라는 것이 얼마나 확실합니까? (즉, 우리에게 그 테스트 프로그램을 보여주고, 전체적으로). – nos

답변

1

나쁜 방법으로 프로그램이 memset (std 라이브러리 제공 버전을 사용하는 대신)과 같은 기능을 다시 정의합니다. 그것은 아마도 "표준"일 수 있습니다 일부 헤더로 인해 ... 어떤 식 으로든 당신의 컴파일러 (gcc가?) 귀하의 플랫폼에 대한 (엘프) 코드를 생성 할 수 있습니다 ...
또한 링크 프로세스가라고 링커가 실패하고 실행 파일을 생성 할 수 없다는 것을 의미합니까?

+0

글쎄, GCC ..에 대해 정당합니다. 누군가 SLES 11 SP2 DVD를 드라이브에 넣고 저장소로 마운트했습니다. 개발 도구를 다시 설치하려는 시도는이 깨진 상태로 남겨 두었습니다. – user3194963

0

기능은 당신이 광범위하게 사용된다 (memset 함수,의 printf를) 실패 말한다. 그리고 확실히 당신은 아무것도 컴파일 할 수 없을 것입니다. 먼저 -L... 플래그를 통해 픽업하는 라이브러리를 살펴볼 것입니다. 어떻게 든 LD_PRELOAD=... 스낵을 확인하십시오. lddnm이 어떤 내용인지 확인하십시오. 아마도 strace myprog 2> /tmp/log 또는 디버거에서 실행하여 미스터리를 해결하십시오.

+0

글쎄 printf (다른 라이브러리?), 실패하지 않습니다 그리고 ** 링크 ** 프로세스 내가 시도하는 빌드의 glibc보다는 실패가 말하는 것입니다. 나는 나머지 (그리고 valgrind도 시도했다.) 그러나 elfread 산출물은 가장 관련이있다. 또한 어셈블리 언어 레벨에서도 gdb로 충분히 멀리 갈 수는 없습니다 ... – user3194963

관련 문제