개발서버가 다른 PC로 이전하는 바람에 크로스 컴파일러는 전부 옮기는 일이 발생했다.
우분투 OS 버전도 20 버전대로 올라갔고, i7 CPU에서 제온으로 향상되었다.
컴파일러도 전부 옮기고 파일도 옮기고, 개발 환경에 필요한 SVN , SAMBA, NFS, TFTP 등을 설치하고
계정을 만들고 정신이 없었다.
그리고 마지막으로 개발 환경을 구축하고 잘 빌드 되는지, 같은 소스로 같은 파일이 나오는지 테스트를 하는데....
체크섬이 다른 문제가 나타났다.
같은 컴파일러, 같은 소스인데 결과가 다르다?
우선 문제를 찾기 위해 다음과 같이 비교했다.
1. 소스코드와 Makefile 이 같은지 비교
1차로 소스가 같은지 비교를 했다. 완전히 똑같았다.
2. 각 소스별 .o (Object) 파일 비교
오브젝트 파일을 각각 비교하니 서로 같았다. 여기서부터 머리가 아프기 시작했다.
1차 정리
각. O 파일에 대해서는 문제가 없는데, 바이너리 실행파일로 만드니 체크섬이 다른게 문제인 지금,
다른 프로젝트도 같은 문제가 있는지 봤다. .SO 파일인 API를 빌드 해보기로 했다.
결과 파일 타입은 다르지만 같은 크로스 컴파일러를 쓰니 같은 문제가 나겠지? 하고 테스트를 진행했다.
?? 똑같다고 ?? 그럼 왜 처음에 테스트한 프로젝트는 문제가 난 거지? 프로젝트를 다시 검토하기 시작했다.
해당 프로젝트는. C, .CPP 파일을 빌드를 한다. 그리고 ..... .a 정적 라이브러리와 참조를 하는 것을 확인했다.
.a 파일도 해당 프로젝트를 빌드 할 때, 선 빌드 후 Lib 폴더로 옮기는 작업을 먼저 한다.
설마. a 파일이 다른가? 하고 비교를 했다.
3. 정적 라이브러리. a 비교
역시. a 파일이 범인이었다. 파일 비교를 하니 내용이 달랐다.
우선. O 파일들을 각각 비교했을 때는 같은데, .a로 만드니 차이가 났다.
처음 파일 내용을 보면 !<arch>가 보인다. 이 내용은 ar로 합쳐진 archive file이라는 뜻이다.
위 ar 파일 헤더를 보면서 왜 다른지 보니, 12자리의 값은 파일 생성된 타임스탬프이다.
그리고 다음 값은 계정 ID 정보가 들어간다. (/etc/passwd에서 확인 가능).
그러니 소스가 같아도 다른 파일이 나올 수밖에 없는 것이다.
두. a 파일 비교
그래서 개발서버를 구축하다가 개고생한 내용을 이렇게 정리를 한다.
'개발이야기' 카테고리의 다른 글
Helix MP3 Decoder 와 ID3 처리 (0) | 2022.01.18 |
---|---|
동적 라이브러리 SO의 체크섬이 달라지는 이유 (0) | 2021.12.18 |
무거운 프로그램에 대한 최적화 #sleep과 #select (0) | 2021.11.28 |
ambiq micro Apollo3 Blue의 Ctimer와 Stimer 그리고 오버플로우 타이머 테스트 (0) | 2021.10.04 |
무선단말기로 둠 실행하기 (0) | 2021.09.18 |