본문 바로가기

운동하는 개발자/c++

Visual studio c++ fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오.

728x90

boost::asio를 사용하여 https 통신을 개발하고 있었는데 다음과 같은 에러가 발생했다

fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오.

해결책은 단순히 /bingobj 옵션만 추가해서 컴파일 하면 되는 것인데 원인이 궁금했다

우선 바쁘신분들을 위한 해결책

프로젝트 속성 -> 구성 속성 -> C/C++ -> 명령줄 여기서 추가 옵션에 /bigobj를 넣으면 끝!

이어서 찾아본 원인을 얘기해 보자면 

우선 공식 MS에 답변이다

출처 : https://learn.microsoft.com/ko-kr/cpp/build/reference/bigobj-increase-number-of-sections-in-dot-obj-file?view=msvc-170 

 

/bigobj(.Obj 파일의 섹션 수 늘리기)

자세한 정보: /bigobj(의 섹션 수 늘리기) Obj 파일)

learn.microsoft.com

 

기본적으로 개체 파일은 최대 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_포맷

 

PE 포맷 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. Portable Executable파일 확장자.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys, .tsp인터넷 미디어 타입 application/vnd.microsoft.portable-executable[1]개발현재 마이크로소프

ko.wikipedia.org


 

728x90