gcc에 보면 -fPIC이란 옵션이 있다. PIC 코드를 생성한다는 옵션이다. PIC라는건 Position Independent Code, 직역하면 위치 독립적인 코드 정도로 나온다. 난 지금껏 이 옵션이 재배치에 관한 옵션인줄 알았다. 즉, -fPIC을 지정하면 재배치 정보가 있어서 아무 주소에나 로드할 수 있고, 지정하지 않으면 고정 주소로 로드되는 뭐 그런걸 상상한 것이다. 한동안 그렇게 잘못된 지식을 가지고도 별 문제 없이 지냈는데 최근에 한 업체와 일을 하면서 잘못 알고 있었다는 것을 깨닫게 되었다. 반성하는 차원에서 PIC 옵션에 관한 내용을 정리해 놓는다.
우선 PIC라는건 재배치랑은 상관이 없다. gcc에서 so로 모듈을 생성하겠다고 하면 기본적으로 재배치 정보를 포함해서 아무 주소에나 로드할 수 있도록 모듈을 만들어 준다. 그럼 재배치랑 연관 있어 보이는 위치 독립적인 코드란 무엇일까? 결론만 말하면 재배치가 필요 없는 코드라고 보면된다. 그렇다면 재배치가 필요 없는 코드는 어떻게 만들까라는 의문을 가질 수 있다. 그건 바이러스 라는 글의 재배치 섹션에 나와 있는 것과 같은 방법을 사용한다고 보면 된다. 컴파일러가 그 일을 대신해 주는 것이다. RealOffset 같은 함수가 절대 주소 참조 시마다 들어가야 하기 때문에 -fPIC 옵션을 지정할 경우 코드가 커지는 것이다.
여기까지 읽고 도대체 뭔 소리야, 라고 할지도 모르겠다. 더 자세한 설명은 아래 글을 참고하자.
http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries
http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries
http://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64