stdout으로 컴파일할 때 g++의 링커 오류

stdout으로 컴파일할 때 g++의 링커 오류

dummy.cpp이라는 C++ 파일이 있고 , stdin에서 나오도록 g++를 사용하여 컴파일해야 하고, g++가 컴파일된 바이너리를 stdout으로 내보낸다고 가정해 보겠습니다 .

stdin 부분만 필요한 경우 다음 명령을 사용하면 됩니다.

$ g++ -x c++ -o dummy - < dummy.cpp

/dev/stdout이제 출력 부분을 추가합니다. 내가 아는 한 (또는 )을 출력 매개 변수로 사용해야 /proc/self/fd/1하지만 링커 오류로 종료되므로 작동하지 않습니다.

$ g++ -x c++ -o /dev/stdout - < dummy.cpp
/usr/bin/ld: final link failed: Illegal seek
collect2: error: ld returned 1 exit status

이를 통해 터미널에서 파일로 리디렉션하면 g++ -x c++ -o /dev/stdout - < dummy.cpp > dummy제대로 작동합니다. 문제는 stdout이 검색 가능하지 않고 파일에 파이프될 때 "된다"는 것입니다. 그런데 왜 ld 파일을 검색할 수 있고 어떻게든 우회할 수 있습니까?

답변1

주석에서 언급했듯이 링커가 파일을 단계적으로 작성한 다음 헤더 영역의 항목을 크기와 오프셋으로 채우기 때문입니다. ELF 형식은 파일의 초기 부분에 이러한 값을 포함하여 적절한 부분을 쉽고 효율적으로 찾을 수 있도록 하므로 링커가 자연스럽게 작동합니다. Zip 파일과 같이 스트리밍용으로 설계된 형식은 매니페스트 데이터를 끝에 배치하여 더 복잡한 경향이 있습니다.

스트리밍 출력 지원은 이론적으로 가능하지만 이를 위해서는 많은 양의 데이터 버퍼링, 데이터 두 번 계산 또는 기타 다양한 비효율적인 관행이 필요할 수 있습니다. 이는 매우 드물기 때문에 코드 복잡성과 링커의 잠재적 비효율성을 고려할 가치가 없을 수 있습니다. . 임시 파일을 사용하고 적절한 정리를 수행하여 작은 쉘 스크립트 또는 쉘 한 줄짜리 스크립트로 이를 달성할 수 있습니다.

관련 정보