isymexport를 사용하여 라이브러리의 심볼 숨기기

기술노트 28924

아키텍처:

ARM

컴포넌트:

linker

업데이트:

2021-06-25 오전 10:28

소개

본 기술 노트는 isymexport와 스티어링파일(steering file)을 사용하여 라이브러리에서 심볼을 숨기는 방법에 대해 설명합니다.

문제

프로그램은 사용자가 만든 라이브러리에서 전역 변수 및/또는 함수들을 정의하면, 같은 이름을 가진 non-weak 한 전역 변수 및/또는 함수를 가집니다.

제안

스티어링파일(steering file)과 isymexport를 사용하여, 프로그램에서 보여질 라이브러리안에 심볼 또는 숨길 심볼을 선택합니다.

일반적으로 라이브러리 파일은 "Linker > Library > Additional libraries" 옵션에서 표시되지만, isymexport로 생성된 파일을 가리킬 수 있습니다.

그러나 isymexport시 넣을 파일은 실행 가능한 ELF 파일(링킹에서 출력된)이어야 라이브러리 파일을 입력 파일로 사용할 수 없습니다.

이러한 제약을 극복하는 방법은 라이브러리를 링킹하고 isymexport에 입력으로 사용할 출력 파일(링크된 이미지)을 생성하는 목적으로 추가 프로젝트를 만드는 것입니다.

다음 예제 (Example project.zip)는 세 가지 프로젝트를 포함합니다:

  1. Library
  2. Common
  3. Application

Library

전역 int형 배열과 배열에서 int형 값을 반환하는 다섯 개의 함수가 포함된 라이브러리 파일(library.a)을 빌드 합니다.

Common

라이브러리 파일(library.a)을 포함하고 링크된 이미지를 생성합니다. 스티어링 파일(steering file)과 함께 isymexport를 호출하여 어떤 심볼을 내보낼지, 숨길지 선택합니다. 배열의 이름과 함수 중 하나가 숨겨집니다.

post-build 커맨드라인은 post-build.bat을 호출합니다. 이는 isymexport를 작동시켜 common.symbols를 생성한 다음 ielfdumparm을 호출하여 common.symbols의 심볼 테이블을 덤프합니다.

진입(entry) 심볼로만 사용되는 더미 함수가 정의됩니다. 이는 링크된 이미지에서 startup 코드가 포함되지 않도록 하기 위한 것으로, 라이브러리만 포함해야 합니다.

라이브러리의 모든 항목이 링크에 포함되도록 하려면, --whole_archive 옵션을 사용하고, --no_remove 옵션과 함께 사용하여 링커에 의해 유지되는 참조되지 않은 섹션을 만들거나 링크된 이미지에서 제거되지 않도록 합니다.

Application

int형 배열, 배열의 이름과 동일한 함수와, 라이브러리의 다섯 가지 함수 중 하나를 정의합니다.

프로그램 프로젝트는 다섯 가지 함수를 차례로 호출하고 반환 값은 stdout으로 출력됩니다.

라이브러리에서 내보낸 심볼은 isymexport에서 생성된 common.symbols 파일을 포함하여 common 프로젝트를 통해 가져옵니다.

C-SPY 디버거를 사용하면, 프로그램 프로젝트뿐만 아니라 공통 프로젝트도 시뮬레이터에서 실행할 수 있습니다. 터미널 I/O 창에는 호출된 함수에서 반환하는 int형 값이 표시됩니다. 이중 한 값은 프로그램 상 배열에서 반환되고, 네 개의 값은 라이브러리의 배열에서 반환합니다.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

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