手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

elfwrap(1)

名称

elfwrap - 将数据包装在 ELF 文件中

用法概要

elfwrap [-64] [-o relobj-file] [-z target=sparc | x86]
data-file ...

描述

elfwrap 实用程序可利用一个或多个数据文件创建 ELF 可重定位目标文件。可重定位目标文件将每个数据文件封装在单个节中,且其中带有可用于引用该节的符号。可重定位目标文件适合于通过后续链接编辑来包含在程序中。用户可使用关联的符号引用所封装的数据。

缺省情况下,将创建 32 位 ELF 可重定位目标文件,这适用于在其上执行 elfwrap 的计算机。–64 选项可用于创建 64 位 ELF 可重定位目标文件。–z target 选项可用于针对特定机器类型创建可重定位目标文件。

缺省情况下,创建的可重定位目标文件为 a.wrap.o。可以使用 –o 选项来指定备用可重定位目标文件名称。

basename(1) 实用程序定义的每个数据文件的基名用于创建分配给关联数据的节和符号名称。例如,如果输入数据文件是 ISV/isv-data,则以下 ELF 信息将与输出可重定位对象内数据关联。

名为 .isv-data 的 ELF 节

该节包含输入数据文件的所有内容。还使用 SHF_SUNW_ELFWRAP 节标志标识节。

名为 isv-data_start 的 ELF 符号

该符号反映 .isv-data 节的起始地址。

名为 isv-data_end 的 ELF 符号

该符号反映 .isv-data 节之后第一个位置的地址。

选项

支持以下选项:

–64

创建 64 位 ELF 可重定位目标文件。

–o relobj-file

生成名为 relobj-file 的可重定位目标文件。

–z target=sparc | x86

指定输出可重定位目标文件的机器类型。支持的目标有 sparcx86。使用指定目标的 32 位机器类型,除非存在 –64 选项,这种情况下使用相应的 64 位机器类型。缺省情况下,生成的是 32 位可重定位目标文件,适用于在其上执行 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:/:

文件

a.wrap.o

创建的缺省可重定位目标文件。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
developer/base-developer-utilities
接口稳定性
Committed(已确定)

另请参见

elfdump(1)ld(1)strings(1)elf(3ELF)attributes(5)ddi_modopen(9F)

Oracle Solaris 11.2 链接程序和库指南

附注

通过 elfwrap 封装的所有数据必须采用适合目标的格式。

输入文件的名称促使符号名称的创建与输入文件数据相关联。因此,应唯一地命名输入文件来避免创建同名的符号。