전체 라이브러리의 재 빌드 없이 라이브러리 모듈을 오버라이딩 및 리디렉팅 하는 방법

특정 임베디드 어플리케이션 개발을 위해 일부 라이브러리 모듈이나 함수를 커스터마이징 해야 하는 경우가 자주 발생합니다. 이러한 커스터마이징 작업을 하는 방법은 여러가지가 있습니다.

먼저 첫 번째 방법은 약간의 커스터마이징을 한 다음 라이브러리를 다시 빌드하는 것입니다. 라이브러리의 재 빌드는 아주 복잡한 과정입니다. C/C++ 표준 라이브러리와 비교를 해 보면, 프리빌드 옵션 적용에 포매터 변경, 파일 디스크립터 변경, 저수준 인터페이스, 멀티바이트 및 플로트/더블 지원을 감안할 때에 문제가 훨씬 복잡해집니다. 

IAR Embedded Workbench의 링커는 전체 라이브러리를 다시 빌드하지 않고도 모듈이나 루틴의 오버라이딩이 가능하도록 해 줍니다. 방법은 간단합니다. 링커가 사용자가 작성한 모듈에 라이브러리 모듈보다 더 높은 우선 순위를 부여하는 것입니다. 또 다른 방법은 함수 호출을 리디렉팅 하는 것입니다. 

링커는 임베디드 어플리케이션 개발에 사용할 수 있는 강력하고도 유연한 툴입니다.  링커는 컴파일러 또는 어셈블러에서 생성되는 하나 이상의 재배치 가능한 오브젝트 파일을 라이브러리 중 하나 이상의 선택된 부분과 합쳐서 실행 가능한 이미지를 만들어 냅니다. 링크는 자동으로 이러한 라이브러리 모듈, Standard C 또는 C++ 라이브러리 변형 중에 어플리케이션에서 필요로 하는 부분 만을 로드합니다. 

그리고 IAR Embedded Workbench의 링커는 최종 실행 파일에서 사용되는 모든 심볼을 포함하는 MAP 파일을 생성할 수가 있습니다. 링커 옵션 메뉴에서 이러한 기능의 사용 여부를 선택하는 것이 가능하며, 일단 선택할 경우에는 커스터마이징이 필요한 모듈을 쉽게 식별할 수가 있습니다. 이를 통해서 모듈이 소속되는 라이브러리를 찾는 데에 도움을 얻을 수 있는 것입니다. 

Linker Map file

예를 들어서 함수 __write를 오버라이드하여 printf를 기본 Terminal I/O에서 UART 또는 심지어 LCD으로 리디렉션 하고자 하는 경우, MAP 파일을 통해서 해당 __write 함수는 write.o 모듈의 일부라는 사실을 파악해 낼 수가 있는 것입니다. 

__write function in Map file

Standard C 또는 C++ 라이브러리의 소스 코드는 IDE 설치 폴더 내 arm\src\lib 디렉토리에서 찾을 수가 있습니다:

source directory in the IDE

소스 코드가 일단 확보되면, 템플릿처럼 파일을 프로젝트에 추가하기만 하면 되며, 모든 커스터마이징은 모듈 내에서 진행이 가능합니다. 몇 줄 코드를 수정하고 나면, 리빌드를 마친 함수 __write의 크기가 0x10에서 0x3C byte로 증가한 사실을 알 수가 있을 것입니다. 

rebuild procedure in the IDE

또 다른 해결책은 프로토타입을 기반으로 하여 함수를 만들어 내는 것입니다:

__ATTRIBUTES size_t __write(int, const unsigned char *, size_t);

이는 링커가 사용자가 작성한 함수에 더 높은 우선순위를 부여한다는 것을 의미합니다. 모듈이 지니는 그 외 다른 기능에는 일체 영향이 없습니다. 

마지막 방법은 참조의 대상이 되는 심벌을 다른 심벌로 바꾸는 것입니다. 이러한 기능은 커멘트 라인 -- redirect를 통해서 링커 내에서 활성화됩니다. 예를 들어, 이는 미 구현 함수에서 stub 함수로 참조를 리디렉션 하는 데에 있어서도 유용하며, 특정한 함수가 서로 달리 구현되는 경우, 이렇게 서로 다른 구현 결과물 중에서 원하는 것을 선택할 때에도 유용합니다. 

예를 들어 __write를 원래의 함수와는 크게 차이가 없이 커스터마이징 한 __write_own로 리디렉션 하고자 하는 경우, 커멘드 라인 명령어는 --redirect __write=__write_own 으로 하면 됩니다. 커멘드는 링커의 추가 옵션에서 입력해야 합니다. 빌드를 하고 나면, __write_own 함수가 원래의 __write 함수 대신 호출되는 것을 확인할 수가 있습니다. 

overwrite settings in the IDE

이렇게 전체 라이브러리의 리빌딩이 없는 모듈 오버라이딩 및 리디렉팅 개념은 개발자가 자체적으로 개발한 라이브러리는 물론 제3자가 개발한 외부 라이브러리에서도 사용이 가능합니다. 이것은 시스템에서 필요로 하는 커스터마이징을 여러 해 동안 검증된 라이브러리, 또는 외부 업체가 제공한 라이브러리의 리빌드 없이 추가할 수 있는 간편한 방법이 됩니다.  

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.