是
call printf
可用于位置独立代码吗? 一方面,调用是相对的,另一方面printf是库函数。 如果答案不是,为什么?在链接阶段,printf的代码没有复制到我写的文件中? (然而在我看来好吧)。
答案 0 :(得分:1)
您可以使用GOT进行相对FAR调用(模块间调用),这将保留绝对地址printf
,然后调用printf
,可以执行某些操作像CALL [GOT + printf_index * sizeof(ptr)]
一样(在汇编/编译期间,这个表达式将向下折叠为常量)。
另一种但非常糟糕的方法是将你正在使用的CRT函数合并到你的共享库/二进制文件中(MSVC调用这个静态链接),但是这个膨胀是二进制文件并且使它非常友好,因此对CRT中可能未被发现的错误开放,这些错误与静态链接。