Kevin Boone, Linux C 프로그램을 UEFI로 부팅하는 5부 안내서 공개
Kevin Boone은 Linux에서 작성한 C 프로그램을 UEFI로 부팅하는 5부 안내서와 `efitest` 예제를 공개했습니다. GCC와 gnu-efi로 PE32+ 실행 파일을 만들고 부팅 매체에서 실행한 뒤 Simple File Protocol로 파일에 접근하는 과정을 설명합니다.
AI, 개발 도구, 오픈소스, 보안과 인프라의 변화와 이용 조건을 설명하는 최신 기사와 해설입니다.
Kevin Boone은 Linux에서 작성한 C 프로그램을 UEFI로 부팅하는 5부 안내서와 `efitest` 예제를 공개했습니다. GCC와 gnu-efi로 PE32+ 실행 파일을 만들고 부팅 매체에서 실행한 뒤 Simple File Protocol로 파일에 접근하는 과정을 설명합니다.
musl libc의 regcomp에서 정수 오버플로가 발생해 잘못된 크기로 메모리를 할당하고 힙 범위 밖에 쓸 수 있습니다. 신뢰할 수 없는 정규식을 처리하는 애플리케이션이 영향을 받으며, 최소한 예측 가능한 충돌이 가능하고 조건에 따라 임의 코드 실행으로 이어질 수도 있습니다.
글쓴이는 glibc의 initstate()가 오류 때 NULL을 반환하지 않는다는 기존 주장을 정정합니다. 실제로는 2013년에 동작이 수정됐지만 매뉴얼의 설명은 갱신되지 않았으며, POSIX가 이 함수의 오류 조건을 정의하지 않는다는 점도 빠져 있습니다.
C 컴파일러 antcc에서 Lua 벤치마크가 -O2로 더 느려지는 원인을 추적합니다. mem2reg가 루프 안의 초기화되지 않은 지역 변수를 잘못 처리해 불필요한 phi 노드를 만들었고, 레지스터 압박과 스필링이 늘어났습니다. alloca 처리 한 줄을 고쳐 성능 저하가 사라졌습니다.
비밀값을 지우려고 넣은 코드가 컴파일러 최적화나 함수 호출 규약 때문에 효과를 내지 못하고, 오히려 메모리에 복사본을 만들기도 합니다. 글은 C와 arm64 컴파일 결과를 비교하며, 버퍼 삭제는 계속하되 작은 지역 변수는 실제로 어디에 저장되고 무엇이 남는지 확인하라고 설명합니다.
학교의 자동 채점 환경에서 허용되지 않은 C 함수를 직접 호출하는 과정을 설명합니다. ASan이 바꿔치기한 함수와 libc 함수의 메모리 배치를 이용해 주소를 계산하고, 실행 권한이 있는 메모리에서 시스템 호출을 수행하는 방식입니다.
Forisek와 Jancina가 제안한 결정론적 소수 판정법은 32비트 정수에서 소수 2, 3, 5, 7로 나누어 확인한 뒤 해시로 밑을 고르고 강한 probable-prime 검사를 수행합니다. 밑을 담은 조회 테이블은 512바이트만 차지하며, 글에는 C 구현이 실려 있습니다.
C의 int와 long이 고정된 비트 수를 보장하지 않는 이유를 1970년대의 다양한 컴퓨터 구조와 C의 이식성 목표에서 설명합니다. 글은 최소 범위를 보장하면서 하드웨어에 맞춰 타입 크기를 정한 선택이 당시에는 효율적인 코드 생성과 여러 기종 지원에 도움이 됐다고 주장하고, 오늘날의 고정 폭 정수 타입과 남은 불편도 함께 다룹니다.
GCC 4~16과 Clang 3~23으로 50개 테스트를 담은 C 벤치마크를 빌드해 실행 시간과 컴파일 시간을 비교했습니다. GCC는 실행 시간이 5% 줄었지만 컴파일 시간은 66% 늘었고, Clang은 각각 8%, 4% 줄었습니다.