728x90
개발 환경을 테스트하는 도중, 오브젝트 파일은 똑같은데 왜 그걸 합친 SO 파일이 체크섬이 다른 케이스가 나타났다. 왜 다를까?
이해가 되지 않는다.
그래서 각 다른 개발 환경에서 빌드 한 so를 헥사 에디터로 비교해 봤다.
헥사 에디터로는 내용 분석이 어려워서 readelf로 분석을 다시 하기로 했다.
첫 헤더는 정상이고, 아래로 내려보니 메모리맵에 로드되는 함수 순서가 서로 다른 것이 나타났다. 위치만 바뀌어서 메모리 주소도 변경되었지만 그 외 차이점은 보이지 않았다.
그럼 왜 메모리 로드되는 순서가 바뀌었을까? 설마 하고 빌드 되는 내역을 다시 조사했다.
빌드 하기 전에 이전 오브젝트 파일을 삭제를 하는데 여기서부터 차이점이 나타났다.
파일 순서가 바뀌었다. makefile 을 살펴보니 rm 을 rm -rf $(OBJS_MAIN) 으로 하고 있었다.
그리고 $(OBJS_MAIN)는 *.c로 되어 있었다.
아마 이건 OS 또는 make 버전의 사이에서 파일 리스트를 정렬하는 방식이 차이가 있는듯하다.
(각 버전은 make 4.1 / 4.2.1 )
SO가 체크섬이 같았던 소스의 makefile을 보니 빌드소스를 리스트업해서 순서대로 빌드하고 있었다.
그러니 매번 빌드하고 합치는 순서가 같았던 것이다.
또한 빌드 옵션에서 -g를 쓰면 디버그 정보 때문에 매번 결과가 바뀌는 이슈도 있다.
728x90
'개발이야기' 카테고리의 다른 글
펌웨어에서 FAT파일시스템의 확장자 구분 (0) | 2022.01.18 |
---|---|
Helix MP3 Decoder 와 ID3 처리 (0) | 2022.01.18 |
크로스컴파일러 개발환경 구축에 대한 팁 (0) | 2021.12.18 |
무거운 프로그램에 대한 최적화 #sleep과 #select (0) | 2021.11.28 |
ambiq micro Apollo3 Blue의 Ctimer와 Stimer 그리고 오버플로우 타이머 테스트 (0) | 2021.10.04 |