如何在linux上动态添加符号来处理符号表?例如,假设我解析一个脚本并确定它有一些我想要添加到全局地址空间的方法,以便之后加载的共享库可以访问它们。我当时想要做的是添加一个函数指针,该函数指针将调用脚本函数并返回结果(在C中)。但我想说"添加' foo'指向& mygenericstub到全局符号表" ..所以当我在带有RTLD_GLOBAL标志的.so文件上执行dlopen()时,它将能够调用' foo'好像它是全局命名空间中的普通C函数..
这个想法很简单:为单个进程扩展动态链接器的功能,还包括脚本中的名称(但不仅仅是有一个入口点函数,它接受一个字符串参数来调用脚本函数 - 而是制作动态链接过程对于稍后可能加载的其他共享对象是透明的。这个想法不是修改现有的表,而是将新表映射为现有表的扩展(也许这可以通过mmap以某种方式完成,但我不知道要映射什么以及如何扩展它)。基本上类似于dlopen与" global"适用于动态名称的选项会很有趣。
答案 0 :(得分:4)
这看起来很麻烦。您应该更改代码,以便直接从脚本解释器/ VM中查找符号。
但是...
假设我解析一个脚本并确定它有一些方法 然后我想将它们添加到全局地址空间中以便它们 可以通过之后加载的共享库访问。
AFAIK,动态链接器没有公开API来注册其他符号。但是,您可以dlopen
使用这些符号的新共享库:
动态生成.so
文件,其中包含您要公开的每个函数的符号;
每个符号都引用类似PLT的模式(代码获取GOT之类的条目并跳转到它);
dlopen
RTLD_GLOBAL
此.so
个文件;
填写类似GOT的变量;
你现在可以dlopen
额外的.so
,它会调用类似PLT的功能并跳过类似GOT的变量到实际功能。
共享对象的代码:
.text
.globl main
.type main, @function
foo:
.cfi_startproc
jmp *foo_got_alike(%rip)
.cfi_endproc
.bss
.align 8
.type foo_got_alike, @object
.size foo_got_alike, 8
foo_got_alike:
.zero 8
这假设您已设法使用某种JIT为0 foo
生成合适的实现。