PLT 와 GOT – 리눅스 동적 링킹과 지연 바인딩
공유 라이브러리는 프로세스마다 다른 주소에 올라간다. ASLR이 켜져 있으면 같은 libc.so.6도 실행할 때마다 위치가 바뀐다. 그런데 .text는 읽기 전용으로 매핑되어 여러 프로세스가 물리 페이지를 공유하므로, call printf의 피연산자에 실제 주소를…
공유 라이브러리는 프로세스마다 다른 주소에 올라간다. ASLR이 켜져 있으면 같은 libc.so.6도 실행할 때마다 위치가 바뀐다. 그런데 .text는 읽기 전용으로 매핑되어 여러 프로세스가 물리 페이지를 공유하므로, call printf의 피연산자에 실제 주소를…
셸 스크립트에서 파일 이름의 확장자를 떼거나 경로에서 디렉터리만 뽑을 때 습관적으로 basename, dirname, sed, tr을 호출하곤 한다. 한두 번이면 문제없지만 수천 개 파일을 도는 루프 안에서는 명령마다 프로세스가 새로 뜨면서…
매크로(macro)는 함수 호출 비용 없이 코드를 재사용하고, 타입에 상관없이 동작하는 코드를 만들 수 있어 C에서 자주 쓰인다. 문제는 전처리기가 문법을 이해하지 않고 토큰을 그대로 치환한다는 점이다. SQUARE(1 + 2)가 5가…
subprocess로 ssh에 비밀번호를 흘려넣으면 실패한다. 프로그램이 stdin이 아니라 제어 터미널에서 비밀번호를 읽기 때문이다. 같은 이유로 파이프에 물린 자식은 출력 버퍼링이 달라져 진행 상황이 실시간으로 안 보이고, bash -i는 프롬프트조차 띄우지…
권한이 있는 프로세스만 열 수 있는 파일이나 소켓을, 정작 일은 권한 없는 프로세스가 처리해야 하는 구조가 종종 필요하다. 경로만 넘겨주고 상대가 다시 open()하게 하면 권한이 없어 실패하거나, 그 사이 파일이…
로그 압축, 이미지 변환, 체크섬 검증처럼 파일 수백 개를 도는 배치 스크립트를 for 루프로 짜면 코어가 6개든 32개든 하나만 쓴다. &로 전부 백그라운드에 던지면 이번엔 수백 개 프로세스가 한꺼번에 떠…
인터페이스가 언제 올라오고 IP가 언제 바뀌는지 감시해야 할 때, 흔히 ip monitor를 subprocess로 띄우고 출력을 파싱한다. 텍스트 포맷이 배포판마다 조금씩 달라 깨지기 쉽고, 1초마다 ip addr를 폴링하는 방식은 그 사이에…
파일을 복사할 때 흔히 쓰는 open() + read()/write() 루프는 데이터가 커널 버퍼 → 유저스페이스 버퍼 → 커널 버퍼로 두 번 오간다. os.copy_file_range()(Linux 4.5+, Python 3.8+)는 파일 디스크립터 두 개를 넘기면…
멀티코어 시스템에서 프로세스는 기본적으로 아무 CPU에서나 스케줄된다. 대부분은 이게 맞는데, 벤치마크 노이즈를 줄이거나, 특정 워커를 특정 코어에 묶어 캐시 지역성을 살리거나, 컨테이너에서 CPU 예산을 나눠 쓰는 경우엔 프로세스가 실제로 어느…
여러 프로세스가 같은 파일을 동시에 읽고 쓰면 레이스 컨디션이 생긴다. "파일에서 값을 읽고, 계산하고, 다시 쓴다"는 흔한 패턴도 두 프로세스가 동시에 끼어들면 한쪽의 갱신이 그냥 사라질 수 있다. Python의 fcntl…