2016-12-01 6 views
0

ELF 파일의 전역 구조를 변경하고 싶습니다. 전역 변수가 구조체인지 여부를 먼저 알고 싶습니다. 그러나 볼 수있는 유일한 정보는 변수의 이름과 크기입니다.ELF 파일에서 변수 유형을 찾는 방법은 무엇입니까?

+2

유형의 세부 정보는 디버그 정보에만 저장됩니다. 프로그램이 달리 실행될 때 정보는 필요하지 않습니다. 당신이 잘못 생각한 것 같습니다 - 실패를 기대하십시오. 구조를 사용하는 코드는 소스가 컴파일 될 때 사용 된 구조체 모양/크기와 밀접하게 연결됩니다. 이를 변경하면 프로그램이 오작동합니다. –

+2

ELF 파일에는 "변수"또는 "유형"이 없습니다. 이것들은 소스 코드 개념입니다. ELF 파일에는 단순히 데이터의 시작을 가리키는 대량 데이터와 기호가 있습니다. 원한다면, 모든 엘프 파일은'char []'과'void *'이다. –

+0

왜 묻는거야? 귀하의 질문은 명확하지 않으며 (ELF 정의가 그 구조를 정의하고 있음), XY 문제 일 가능성이 있습니다 (http://xyproblem.info). 따라서 ** 귀하의 질문을 ** 수정하여 동기를 부여하고 더 설명하십시오. –

답변

5

찾을 수 없습니다. ELF 형식은 매우 제한된 형식 정보를 가지고 있으며 일부 전역 변수가 struct 또는 int인지 여부를 알지 못하며 주로 변수는 sizeof입니다. elf(5)을 참조하십시오.

그러나 디버그 지원을 위해 프로그램 (및 사용중인 라이브러리)을 컴파일하는 경우 (예 : g++ -Wall -g). ELF 파일에는 흔히 DWARF 형식을 사용하는 추가 디버그 섹션이 포함됩니다. 이 정보는 strip 명령을 사용하여 ELF 파일에서 제거 할 수 있습니다. 따라서 strip(1) & readelf(1) & objdump(1)을 참조하십시오.

하지만 실제로는 source code을 사용하고 싶습니다. 따라서 프로그램의 소스를 얻으십시오 (리눅스는 주로 free software으로 만들어 졌기 때문에 일반적으로 가능합니다). 그리고 프로그램을 재 컴파일하십시오. 물론 프로그램의 소스 코드를 연구하십시오. 컴파일러를 커스터마이징 (예 : 자신의 GCC 플러그인을 작성하거나 GCC MELT을 사용하거나 Clang 컴파일러를 커스터마이징)하면 코드를 다시 컴파일하고 모든 전역 변수 선언을 구체적으로 처리하기를 원할 수도 있습니다.).