Answers:
我想我们正在谈论x86体系结构。
您不能在保护模式下使用自我修改代码,该模式在我所知道的大多数基于UNIX的操作系统中(不仅是)都使用,因为代码段始终是只读的。加载程序无法控制-内核的内存管理子系统正在处理它。
但是,即使您可以像您所说的那样“在加载时为该表创建代码”,也无法实现共享库的全部目的。这样,每个进程将在其地址空间中具有库功能的“私有”副本,从而有效地增加了其内存占用量(创建共享库的原因之一)就是为了解决此问题。
您描述的整个过程非常复杂,并且比当前使用的PLT方法花费更多的处理周期,并且可能会引入更多,新的和有趣的安全问题。
ELF DSO可以使用标志(DF_TEXREL)来声明它们需要通过修改其文本部分(通常是只读的)来进行重新分配。不过,跳转表方法以及与PIE位置无关的代码应更为优化。
(在http://www.akkadia.org/drepper/dsohowto.pdf中找到了该方法,但其他资源也提到了这一点)。