elfwrap - ELFファイルにデータをラップする
elfwrap [-64] [-e end-symbol] [-n section-name] [-o relobj-file] [-s start-symbol] [-V] [-z target=sparc | x86] data-file ...
elfwrap ユーティリティーは、1 つ以上のデータファイルから ELF 再配置可能オブジェクトファイルを作成します。再配置可能オブジェクトは、個々のセクション内の各データファイルを、セクションの参照に使用できるシンボルとともにカプセル化します。再配置可能オブジェクトを含めておくと、以後のリンク編集で便利です。ユーザーは、関連付けられているシンボルを使用すると、カプセル化されたデータを参照できます。
デフォルトでは、elfwrap が実行されるマシンに適した 32 ビット ELF 再配置可能オブジェクトが作成されます。–64 オプションを使用すると、64 ビット ELF 再配置可能オブジェクトを作成できます。–z target オプションを使用すると、特定の機械タイプ用の再配置可能オブジェクトを作成できます。
デフォルトでは、再配置可能オブジェクト a.wrap.o が作成されます。–o オプションを使用すると、別の再配置可能オブジェクト名を指定できます。
デフォルトでは、basename(1) ユーティリティーによって定義される各データファイルのベース名は、関連データに割り当てられるセクション名やシンボル名を作成する際に使用されます。–e、–n、および –s オプションを使用すると、これらのデフォルトをオーバーライドできます。これらのオプションを使用しない場合、入力データファイル ISV/isv-data から出力される再配置可能オブジェクト内のデータには、次の ELF 情報が関連付けられます。
このセクションには、入力データファイルのすべての内容が含まれます。SHF_SUNW_ELFWRAP セクションフラグでセクションを識別することも可能です。
このシンボルは、.isv-data セクションの開始アドレスを示します。
このシンボルは、.isv-data セクションのあとにある、最初の場所のアドレスを示します。
サポートしているオプションは、次のとおりです。
64 ビット ELF 再配置可能オブジェクトを作成します。
コマンド行でこのオプションのあとに続く入力データファイルの末尾に関連付けるシンボル名を指定します。
コマンド行でこのオプションのあとに続く入力データファイルに使用するセクション名を指定します。
relobj-file という名前の再配置可能オブジェクトを生成します。
コマンド行でこのオプションのあとに続く入力データファイルの先頭に関連付けるシンボル名を指定します。
出力される再配置可能オブジェクトの機械タイプを指定します。サポートされるターゲットは、sparc および x86 です。–64 オプションも存在していて、対応する 64 ビット機械タイプが使用されている場合を除き、指定されたターゲット用の 32 ビット機械タイプが使用されます。デフォルトでは、elfwrap が実行されるマシン用の 32 ビットの再配置可能オブジェクトが生成されます。
バージョン情報を出力してすぐに終了します。
使用法に関するメッセージを出力したあと、すぐに終了します。
–e、–n、および –s オプションは、コマンド行でこれらのオプションのあとに続く入力データファイルに関連付けられます。これらのオプションを入力データファイルの前に指定することを繰り返して、各データファイルに一意の名前を関連付けることができます。複数の入力データファイルに同じ –e または –s オプションを適用すると、作成される再配置可能オブジェクト内に多重定義シンボルが定義されることになります。これにより、オブジェクトはそれ以上のリンク編集に適さなくなることがあります。このような方法でこれらのオプションを複数使用すると、elfwrap から警告メッセージが発行されます。
次の例は、システム passwd ファイルとシステム group ファイルを再配置可能オブジェクト passgroup.o 内にカプセル化します。
example% elfwrap -o passgroup.o /etc/passwd /etc/group example% elfdump -c -T PROGBITS passgroup.o Section Header[1]: sh_name: .passwd sh_addr: 0 sh_flags: [ SHF_ALLOC SHF_SUNW_ELFWRAP ] sh_size: 0x5a2 sh_type: [ SHT_PROGBITS ] ... Section Header[2]: sh_name: .group sh_addr: 0 sh_flags: [ SHF_ALLOC SHF_SUNW_ELFWRAP ] sh_size: 0x199 sh_type: [ SHT_PROGBITS ] ... example% elfdump -s passgroup.o | egrep "passwd|group" [2] 0 0 SECT LOCL D 0 .passwd [3] 0 0 SECT LOCL D 0 .group [7] 0 0x5a2 OBJT GLOB D 0 .passwd passwd_start [8] 0x5a2 0 OBJT GLOB D 0 .passwd passwd_end [9] 0 0x199 OBJT GLOB D 0 .group group_start [10] 0x199 0 OBJT GLOB D 0 .group group_end example% strings -N.passwd passgroup.o | head -1 root:x:0:0:Super-User:/:/usr/sbin/sh example% strings -N.group passgroup.o | head -1 root::0:
次のユーザーコードから、再配置可能オブジェクト内のパスワードデータを参照することができます。
example% cat main.c #include <stdio.h> extern char passwd_start, passwd_end; void main() { char *pstart = &passwd_start, *pend = &passwd_end; char *str, *lstr; for (lstr = str = pstart; str < pend; str++) { if ((*str == '\n') && (str != (pend - 1))) { (void) printf("%.*s", (++str - lstr), lstr); lstr = str; } } } example% cc -o main main.c passgroup.o example% ./main root:x:0:0:Super-User:/:/usr/sbin/sh .... nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:
次の例では、同じ入力ファイルを使用しますが、そのデータに共通のセクション名を割り当て、各データに一意のシンボル名を関連付けます。
example% elfwrap -o passgroup.o -n .rodata \ -s P_START -e P_END /etc/passwd \ -s G_START -e G_END /etc/group example% elfdump -c -T PROGBITS passgroup.o Section Header[1]: sh_name: .rodata sh_addr: 0 sh_flags: [ SHF_ALLOC SHF_SUNW_ELFWRAP ] sh_size: 0x5a2 sh_type: [ SHT_PROGBITS ] ... Section Header[2]: sh_name: .rodata sh_addr: 0 sh_flags: [ SHF_ALLOC SHF_SUNW_ELFWRAP ] sh_size: 0x199 sh_type: [ SHT_PROGBITS ] ... example% elfdump -s passgroup.o | fgrep .rodata [2] 0 0 SECT LOCL D 0 .rodata [3] 0 0 SECT LOCL D 0 .rodata [7] 0 0x5a2 OBJT GLOB D 0 .rodata P_START [8] 0x5a2 0 OBJT GLOB D 0 .rodata P_END [9] 0 0x199 OBJT GLOB D 0 .rodata G_START [10] 0x199 0 OBJT GLOB D 0 .rodata G_END
作成されるデフォルトの再配置可能オブジェクトファイル。
属性についての詳細は、マニュアルページの attributes(7) を参照してください。
|
elfdump(1), ld(1), strings(1), elf(3ELF), attributes(7), ddi_modopen(9F)
OracleSolaris 11.4 リンカーとライブラリガイド
elfwrap でカプセル化されたデータはすべて、対象のターゲットに適した形式である必要があります。
入力ファイルデータに関連付けるシンボル名の作成は、入力ファイルの名前によって駆動されます。したがって、同じ名前のシンボルが作成されないように、入力ファイルには一意の名前を付けるべきです。