链接程序和库指南

扫描可装入目标文件

可以获取运行时链接程序中维护的每个目标文件的信息。通过使用 rtld_db.h 中定义的以下结构,可实现链接映射:

typedef struct rd_loadobj {

        psaddr_t        rl_nameaddr;

        unsigned        rl_flags;

        psaddr_t        rl_base;

        psaddr_t        rl_data_base;

        unsigned        rl_lmident;

        psaddr_t        rl_refnameaddr;

        psaddr_t        rl_plt_base;

        unsigned        rl_plt_size;

        psaddr_t        rl_bend;

        psaddr_t        rl_padstart;

        psaddr_t        rl_padend;

        psaddt_t        rl_dynamic;

} rd_loadobj_t;

请注意,在此结构中提供的所有地址(包括字符串指针)都是目标进程中的地址,而不是控制进程本身的地址空间中的地址。

rl_nameaddr

指向包含动态库名称的字符串的指针。

rl_flags

在修订版 RD_VERSION2 中,使用 RD_FLG_MEM_OBJECT 标识动态装入的可重定位目标文件。

rl_base

动态库的基本地址。

rl_data_base

动态库数据段的基本地址。

rl_lmident

链接映射标识符(请参见建立名称空间)。

rl_refnameaddr

如果动态库是标准过滤器,则指向 filtee 的名称。

rl_plt_baserl_plt_size

提供这些元素是为了向下兼容,当前未使用。

rl_bend

目标文件的结束地址 (text + data + bss)。在修订版 RD_VERSION2 中,动态装入的可重定位目标文件将导致此元素指向创建的目标文件(包括其节标题)的结尾。

rl_padstart

动态库之前填充的基本地址(请参阅动态库填充)。

rl_padend

动态库之后填充的基本地址(请参阅动态库填充)。

rl_dynamic

添加了 RD_VERSION2 的此字段可提供目标文件动态节的基本地址,从而可允许引用 DT_CHECKSUM 之类的项(请参见表 7–32)。

rd_loadobj_iter() 例程使用此目标文件数据结构来访问运行时链接程序的链接映射列表中的信息:

rd_loadobj_iter()

会对当前在目标进程中装入的所有动态库重复执行此函数。

typedef int rl_iter_f(const rd_loadobj_t *, void *);

 

rd_err_e rd_loadobj_iter(rd_agent_t * rap, rl_iter_f * cb,

        void * clnt_data);

每次重复时都会调用 cb 指定的导入函数。可以使用 clnt_data 将数据传递给 cb 调用。通过指向可变(已分配的栈)rd_loadobj_t 结构的指针可返回有关每个目标文件的信息。

cb 例程中的返回代码通过 rd_loadobj_iter() 进行检查,并具有以下含义:

  • 1-继续处理链接映射。

  • 0-停止处理链接映射并将控制权返回给控制进程。

rd_loadobj_iter() 运行成功时会返回 RD_OK。返回 RD_NOMAPS 表示运行时链接程序尚未装入初始链接映射。