2014-01-07 7 views
3

제가 만든 작은 프로그램에는 바이너리 자체에 포함시키려는 작은 비트 맵과 사운드 클립이 많이 포함되어 있습니다 (어쨌든 메모리 매핑이 필요합니다). MS PE/COFF 표준에는 좋은 파일 시스템과 같은 계층 구조를 갖는 리소스 (.rsrc 섹션)를 포함시키는 방법에 대한 구체적인 설명이 있습니다. Linux ELF 사양에서 그런 부분을 찾지 못했습니다. 따라서이 리소스를 자유롭게 포함 할 수 있다고 생각합니다.한 섹션에 그룹화 된 ELF 객체에 리소스를 추가하십시오.

달성하고자하는 것은 각 리소스의 시작 부분에 심볼릭 이름과 함께 하나의 ELF 섹션에만 모든 리소스를 포함 할 수 있다는 것입니다 (따라서 C 코드에서 해당 리소스를 처리 할 수 ​​있습니다). 내가 쉽게 내 C 코드로 연결 될 수있는 ELF 객체에이를 조립할 수

SECTION .rsrc 
    _resource_1: 
     incbin "../rsrc/file_name_1" 
    _resource_1_length: 
     dw $-resource_1 
    _resource_2: 
     incbin "../rsrc/file_name_2" 
    _resource_2_length: 
     dw $-resource_2 
    ... 

: 내가 지금 뭐하는 거지하면 다음과 레이아웃이 작은 NASM 파일을 사용하고 있습니다. 그러나, 나는 어셈블리의 사용을 싫어하므로 내 코드는 플랫폼에 따라 다르다.

동일한 결과를 얻는 더 좋은 방법은 무엇입니까?

이 질문에 이미 유래에 물었지만, 제안 된 솔루션은 내 경우에 적용되지 않습니다되었습니다 C 코드의 진수 배열이 정말 아니므로 자원을 포함 C/C++ with GCC: Statically add resource files to executable/library :이 솔루션은 여기에 제안

  • 유용하기 때문에 코드와 데이터가 하나의 섹션에 혼합되어 있습니다. (게다가 리소스를 배열로 변환하면 리소스를 미리 볼 수 없으므로 실용적이지 않습니다.)
  • 모든 리소스에 objcopy --add-section을 사용하면 모든 리소스가 작동하지만 모든 리소스는 헤더와 그 모든 것을 포함하여 자체 섹션을 가져옵니다. 그건 내가 약 120 파일을 포함 (각각 +/- 4K)로 조금 낭비가 보인다.
+1

"__section"GCC 키워드는 16 진수 배열을 포함하는 제안 된 솔루션과 함께 사용할 수 있습니다. "배열"파일을 빌드 환경의 바이너리 "부모"에 종속시킴으로써 파일을 미리 볼 수 있습니다. –

답변

0

당신은 당신이 일정한 배열로 hexarray를 정의하면 ELF 파일, 특히, 기본적으로 그들을 분리되므로, hexarrays를 사용하여 데이터와 코드를 혼합한다는 틀렸어, 그것은 .rodata에 끝날 것입니다. .rodata에 대한 자세한 내용은 an old post of mine을 참조하십시오.

objcopy과 함께 리소스를 추가하면 개체 파일에 여러 섹션이 만들어 지지만 모두 출력 파일에 병합되어야합니다. 그런 다음 거의 모든 추가 패딩이 있어야합니다. Another post on a related topic.

다른 대안 실제 이진 파일 (예 : PNG)에서 ELF로 이동하려면 ldscripts을 사용할 수 있습니다. 임의의 섹션/기호가있는 ELF 파일을 만들고 파일에서 데이터를 읽을 수 있습니다. ELF 파일을 작성하려면 사용자 정의 규칙이 필요합니다.

저는 실제로 이런 종류의 자원 관리가 ELF에 더 자주 사용되지 않는다는 것에 놀랐습니다. 특히 많은 작은 파일의 경우 파일 시스템 성능이 상당히 빨리 향상 될 것입니다. 많은.

0

리소스가 너무 크지 않은 경우이를 C/C++ 소스 코드 (예 : 서명되지 않은 char 배열)로 변환 할 수 있습니다. 그런 다음 전역 변수로 액세스하여 일반 소스 코드처럼 &을 컴파일하십시오.