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