728x90
boost::asio를 사용하여 https 통신을 개발하고 있었는데 다음과 같은 에러가 발생했다
fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오.
해결책은 단순히 /bingobj 옵션만 추가해서 컴파일 하면 되는 것인데 원인이 궁금했다
우선 바쁘신분들을 위한 해결책
프로젝트 속성 -> 구성 속성 -> C/C++ -> 명령줄 여기서 추가 옵션에 /bigobj를 넣으면 끝!
이어서 찾아본 원인을 얘기해 보자면
우선 공식 MS에 답변이다
기본적으로 개체 파일은 최대 65,279개(거의 2^16개) 주소 지정 가능한 섹션을 보유할 수 있습니다.
이 제한은 지정된 대상 플랫폼에 관계없이 적용됩니다.
/bigobj 는 해당 주소 용량을 4,294,967,296(2^32)로 증가합니다
\
개체파일에서 섹션 수가 너무 많다는것인데 고작 코드 130줄에 간단한 코드인데? 싶었는데 계속 읽어보니
템플릿 라이브러리를 많이 사용하는 코드에는 더 많은 섹션을 보유할 수 있는
.obj 파일이 필요할 수 있습니다.
boost 라이브러리가 워낙 거대하고 템플릿을 많이 쓰다 보니 저 용량이 초과된 것이었다
그렇다면 이 섹션 수는 왜 제한하는 것인가? 알아보았다
Visual Studio는 오브젝트 파일 또는 실행 파일에서 섹션의 최대 크기를 제한합니다.
이 제한은 Windows에서 사용되는 Portable Executable (PE) 파일 포맷과의 호환성을
보장하기 위해 부과됩니다.
PE 파일 포맷에서 각 섹션은 섹션 이름, 크기 및 기타 속성을 포함하는 고정 된 헤더가 있습니다.
PE 파일 포맷에서 섹션의 최대 크기는 4 기가바이트 (2^32-1 바이트)로 제한됩니다.
따라서 오브젝트 파일 또는 실행 파일의 섹션 크기가이 크기 제한을 초과하는 경우
PE 파일 포맷과 호환되지 않으며 파일이 운영 체제에서 로드 될 때 문제가 발생할 수 있습니다.
그리고 저 /bigobj 옵션을 주면 64비트 빌드기준으로 제한을 8기가 까지 늘린다
또 PE포맷이 뭔지 궁금한 분들을 위한 링크를 남기며 마무리한다
https://ko.wikipedia.org/wiki/PE_포맷
728x90