2014-06-15 2 views
1

Hello World C 파일을 컴파일하고 하나의 섹션 (hello world 기능 만 필요함)이 필요합니다.objcopy : 특정 섹션을 복사하지 못했습니다. ('.rodata'required, not present [...])

컴파일 된 파일의 형식은 elf32-i386이며 .rodata, .text.hello, .comment, .eh_frame의 4 개 섹션으로 구성됩니다.

나는 단지 .text.hello 부분을 추출하는 objcopy의 사용하려고 : http://www.thegeekstuff.com/2013/01/objcopy-examples/ 예 3.

그것은 실패,보고 :

BFD: hello_new: symbol `.rodata' required but not present 
objcopy:hello_new: No symbols 

어떻게 그것을 해결하기 위해?

감사합니다.

보다도, 파블는

답변

1

첫째, 당신 만하여 텍스트 섹션을 필요로 언급 - 런타임 실행의 목적을 위해? 맞지 않습니다. hello 함수에 내부에 하드 코드 된 문자열이 있으면이 모든 문자열은 .rodata 섹션에 위치하므로이 섹션을 무시할 것입니까?

.eh_frame은 디버거 용이며 .comment는 필요하지 않지만 .data도 필요합니다.

또 다른 것은 재배치 테이블입니다 - 기능이 임의의 메모리 영역에 동적으로로드되는 경우 함수 안의 많은 영역에 패치가 필요할 수 있습니다 ..... 사용자의 "objdump -r"을 확인하십시오 ELF는 재배치 엔트리가 있는지 확인합니다. 그렇지 않다면, 당신은 안전합니다.

또한 "const"로 선언 된 함수 내부의 모든 내용은 .rodata 섹션에도 포함됩니다. 물론 글로벌 데이터입니다. 함수의 지역 변수 또는 상수가 스택에 있습니다. 그리고 모든 글로벌 데이터는 .data 섹션 안에 있습니다.

원래 URL의 예제 3은 상호 참조 (".interp"섹션)가 없으므로 "objdump -s"에 오류가 없으므로 그 이유가 있습니다. 귀하의 경우 .text는 .rodata 섹션에 대한 상호 참조가 있지만 .text 섹션 만 추출한 후에는 사용할 수 없습니다.

관련 문제