0

  call printf 

可以在位置无关的代码中使用吗?一方面, call 是相对的,另一方面 printf 是一个库函数。如果答案不是,为什么?在链接阶段 printf 的代码没有复制到我写的文件中?(然后在我看来还可以)。

4

1 回答 1

1

您可以使用GOT进行相对 FAR 调用(模块间调用) ,它将保存绝对地址到printf,然后调用printf,将执行类似的CALL [GOT + printf_index * sizeof(ptr)]操作(此表达式将在汇编/编译期间折叠为常量)。

另一种但完全可怕的方法是将您正在使用的 CRT 函数合并到您的共享库/二进制文件中(MSVC 调用此静态链接),但是这会使二进制文件膨胀并使其对未来不友好,因此可能会开放静态链接到的 CRT 中未发现的错误。

于 2012-07-23T16:00:15.657 回答