본문 바로가기
개발이야기

동적 라이브러리 SO의 체크섬이 달라지는 이유

by 코저씨 2021. 12. 18.
728x90

개발 환경을 테스트하는 도중, 오브젝트 파일은 똑같은데 왜 그걸 합친 SO 파일이 체크섬이 다른 케이스가 나타났다. 왜 다를까?

이해가 되지 않는다.

그래서 각 다른 개발 환경에서 빌드 한 so를 헥사 에디터로 비교해 봤다.

헥사 에디터로는 내용 분석이 어려워서 readelf로 분석을 다시 하기로 했다.

readelf -a로 확인한 내용 비교

첫 헤더는 정상이고, 아래로 내려보니 메모리맵에 로드되는 함수 순서가 서로 다른 것이 나타났다. 위치만 바뀌어서 메모리 주소도 변경되었지만 그 외 차이점은 보이지 않았다.

메모리 로드가 다르다

그럼 왜 메모리 로드되는 순서가 바뀌었을까? 설마 하고 빌드 되는 내역을 다시 조사했다. 
빌드 하기 전에 이전 오브젝트 파일을 삭제를 하는데 여기서부터 차이점이 나타났다.

파일 순서가 바뀌었다. makefile 을 살펴보니 rm 을 rm -rf $(OBJS_MAIN) 으로 하고 있었다.
그리고 $(OBJS_MAIN)는 *.c로 되어 있었다.

아마 이건 OS 또는 make 버전의 사이에서 파일 리스트를 정렬하는 방식이 차이가 있는듯하다.

(각 버전은 make 4.1 / 4.2.1 )

SO가 체크섬이 같았던 소스의 makefile을 보니 빌드소스를 리스트업해서 순서대로 빌드하고 있었다.

그러니 매번 빌드하고 합치는 순서가 같았던 것이다.

또한 빌드 옵션에서 -g를 쓰면 디버그 정보 때문에 매번 결과가 바뀌는 이슈도 있다.

728x90