2013-07-24 4 views
4

--add-section의 사용을 중심으로 두 가지 질문이 있습니다. 간단한 제목이 제목에 있습니다. 저의 독서를 토대로, 저는 어떻게해서 --add-section을 어떻게 실행할 수 있는지 알 수 없었습니다.어떻게 OBJCOPY의 --add-section 스위치를 사용할 수 있습니까?

add-section을 사용하려면 섹션 이름을 전달해야합니다. 기존 섹션 이름을 사용하면 프로그램에서 "섹션 '.data'을 추가 할 수 없습니다 : 잘못된 형식의 파일로 응답합니다. ' 아마도 나는 다른 매개 변수를 전달하기 만하면됩니다. 내가 선호하는 새 섹션 이름을 사용하면 세그먼트에 .blob '이 할당되지 않았습니다. "라는 경고를받습니다.

이제 "not in segment (세그먼트에 포함 안 됨)"경고를 제외하고는 필자가 작업 할 필 요성을 얻었습니다. 나는이 블롭을 실행 파일에 넣는 정당한 방법이 있는지 알아 내고 싶다. 나는 그것을 링크 할 것이지만, 추가하고있는 데이터가 실행 파일 자체의 내용으로부터 생성되기 때문에 그렇게 쉽지는 않습니다.

두 번째 질문은 실제로 내가 염려하는 것입니다. 링크가 완료 될 때까지 BLOB를 계산할 수 없다는 점을 감안할 때 다음 작업을 수행 할 수있는 방법이 있습니까? 이 메모리에 올바른 위치로 실행시에로드되도록

  1. 링크 ELF
  2. 는 ELF 파일 ELF 파일 및 기타 데이터
  3. 추가 덩어리에서 덩어리를 생성 파일

    objcopy --add-section .blob=blob.o \ --set-section-flags .blob=alloc,contents,load,readonly \ --change-section-address .blob=ADDRESS \ program.elf program.blobbed.elf

링크의 일부로 섹션 및/또는 세그먼트를 ELF 파일에 추가하고이 BLOB를 삽입 해 주시면 기꺼이 부탁드립니다. 어떻게해야할지 모르겠다.

두 번째 링크로이 묘기를 달성 할 수 있었지만 objcopy가 더 깨끗해졌습니다.

  1. 링크 ELF
  2. 새로운 blob.o을 포함하여 ELF 파일 및 기타 데이터
  3. 다시 링크 ELF 파일에서 방울을 생성 파일

UPDATE :이 마지막 전략으로 가능한 수 있습니다 재 링크가 첫 번째 링크에서 생성 된 프로그램 부분에서 무언가를 변경하지 않는 한 오래. 처음 시도 할 때 발생하는 것은 아니지만 문제를 해결하는 것이 가능할 수 있습니다. 따라서 두 번째 링크를 거치지 않고이 BLOB에 --add-section을 사용하여 추가하려고합니다.

답변

0

귀하의 질문에 답을하고 있지는 않지만 필자가 이전에 사용한 이런 접근법 중 하나는 자리 표시 자 블록에 링크 한 다음 나중에 올바른 값을 패치하는 것이 었습니다.

나는 이것이 당신이하고 싶은 것이 아니라는 것을 알고 있지만, 그것을 할 수있는 매우 간단하고 신뢰할 수있는 방법입니다. 또한 툴 체인/플랫폼에 무관심하다는 큰 장점이 있습니다.

+0

나는 블록의 크기를 선험적으로 알기 때문에 이런 접근법을 고려했다.그러나이 자리 표시 자의 얼룩이 있으면 첫 번째 링크의 결과가 바뀌고 그럴 수 있습니다. 블롭의 핵심은 덤프 된 바이너리의 끝 부분에 무결성 검사 데이터를 추가하는 것입니다. 가짜 얼룩의 존재는 불가능하지는 않지만 까다 롭습니다. 나는 더 깨끗한 방법을 찾고있다. – user2600958

+0

@ user2600958 최종 해결책은 무엇입니까? –

1

당신은 그 섹션을 추가하고, NULs로 채우고, blob을 계산할 수 있습니다. 그런 다음이 섹션에 얼룩을 패치하십시오. 나중에 ELF의 무결성을 검사 할 때 해당 섹션이 NUL로 가득 차있는 것처럼 처리하고 BLOB를 다시 계산합니다. 마지막으로, 섹션에 저장된 계산 된 blob과 blob을 비교합니다.