3

したがって、カスタム セクションを ELF ファイルに追加し、関数と構造をカスタム セクションにマップするように強制できることはわかっています。これは次の方法で実行できます。これは、次の名前の構造を含む__atribute__ section("sectionname") カスタム セクション名を持つ現在の ELF からの readelf 出力です。.my_custom_sectionver_info

構造:

typedef struct version_info
{
  int     dd ;
  int      mm;
  int    yy;
  int      hr;
  int      min;
  char      *software_type;
  char   *software_version;
  char    *hex_tools_version;
} version_info;

version_info ver_info __attribute__ ((section(".my_custom_section"))) = {7, 10, 2013, 17, 17, "some_type", "some_sw_version", "some_version"} ;

エルフの読み取りは次のようになります。

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            000000d4 0000d4 00003c 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          00000110 000110 0000a0 10   A  3   5  4
  [ 3] .dynstr           STRTAB          000001b0 0001b0 000026 00   A  0   0  1
  [ 4] .rela.dyn         RELA            000001d8 0001d8 000024 0c   A  2   0  4
  [ 5] .plt              PROGBITS        00001000 001000 000000 00  AX  0   0 16
  [ 6] .text             PROGBITS        00001000 001000 00001c 00  AX  0   0  4
  [ 7] .rodata           PROGBITS        00002000 002000 000027 00   A  0   0  1
  [ 8] .dynamic          DYNAMIC         00004000 003000 000078 08  WA  3   0  4
  [ 9] .got              PROGBITS        00004078 003078 000000 00  WA  0   0  4
  [10] .got.plt          PROGBITS        00004078 003078 000010 04  WA  0   0  8
  [11] .my_custom_sectio PROGBITS        00004088 003088 000020 00  WA  0   0  4
  [12] .bss              NOBITS          000040c0 0030a8 000000 00  WA  0   0  1
  [13] .comment          PROGBITS        00000000 0030a8 000028 01  MS  0   0  1
  [14] .shstrtab         STRTAB          00000000 0030d0 000081 00      0   0  1
  [15] .symtab           SYMTAB          00000000 0033fc 000180 10     16  19  4
  [16] .strtab           STRTAB          00000000 00357c 000075 00      0   0  1

Program Headers:

  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00000000 0x00000000 0x001fc 0x001fc R   0x1000
  LOAD           0x001000 0x00001000 0x00001000 0x0001c 0x0001c R E 0x1000
  LOAD           0x002000 0x00002000 0x00002000 0x00027 0x00027 R   0x1000
  LOAD           0x003000 0x00004000 0x00004000 0x000a8 0x000c0 RW  0x1000
  DYNAMIC        0x003000 0x00004000 0x00004000 0x00078 0x00078 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .hash .dynsym .dynstr .rela.dyn
   01     .text
   02     .rodata
   03     .dynamic .got.plt .my_custom_section
   04     .dynamic

この場合、カスタム セクションは.dynamic,.got.plt セクションでクラブ化され、セグメント 03 にマッピングされます。このセクションを独立したセグメント自体としてマッピングしたいと考えています。

セクションからセグメントへのマッピングを制御できますか? あなたならどうしますか?

編集:
1.dlsymこの構造シンボルを使用しない理由: この構造を動的シンボルとして追加することにあまり熱心ではない理由は、バージョン情報を読み取る API を作成しているためです (別のセグメントに含める予定です)。 、最終的にはdlopen、この SO ファイルが必要かどうかを判断します。古いSOを開かないようにするためのセキュリティ対策の一環です。

2. カスタム リンカー スクリプトの使用: 現在、次のセクションを追加するカスタム リンカー スクリプトを使用しています。

.my_custom_section() :
  {
    KEEP (*version_info.o (.rodata* ))
  }

これにより、目的の名前のセクションを作成し、データをそこに配置できます。.rodataしかし、私はまだこのセクションや他のセクションとの衝突を避けるのに苦労しています.

リンカー スクリプトで何らかの構成を指定することで、このセクションを独立したセグメントとしてマップできると確信していますが、それはまさに私が理解しようとしていることです。

4

2 に答える 2