C 如何使用机器代码调用库函数?

C 如何使用机器代码调用库函数?,c,gcc,compilation,x86,C,Gcc,Compilation,X86,很抱歉,如果问题的措辞很糟糕,但我已使用objdump反汇编了一个包含几个标准库的编译文件,并看到了以下说明: e8 d7 7d 00 00 call 8051bd0 <_IO_fgets> 据我所知,地址0x7ddc是在编译时从链接表中检索的,在运行时不可用。现在我想知道是否存在一条指令,我可以使用它(前提是我可以在运行时注入它,并知道类似0x8051bd0的函数地址)来实现相同的功能?我试着查看不同的通话说明,但我不知道如何处理这些信息。任何帮助都将不胜感

很抱歉,如果问题的措辞很糟糕,但我已使用objdump反汇编了一个包含几个标准库的编译文件,并看到了以下说明:

e8 d7 7d 00 00          call   8051bd0 <_IO_fgets>

据我所知,地址0x7ddc是在编译时从链接表中检索的,在运行时不可用。现在我想知道是否存在一条指令,我可以使用它(前提是我可以在运行时注入它,并知道类似0x8051bd0的函数地址)来实现相同的功能?我试着查看不同的通话说明,但我不知道如何处理这些信息。任何帮助都将不胜感激。

0x7dd7
是相对于调用指令结束的相对偏移量。这个机器代码实际上是在硬件上运行的。是的,
-static
将生成一个非PIE可执行文件,其中绝对地址是链接时间常数。如果知道指令结束的绝对地址,当然可以使用正确的偏移量注入
调用rel32
。当然,在这一点上,它不再是“汇编”语言,而是机器代码。你没有一个汇编器+链接器为你处理符号->偏移量。@PeterCordes哦,我现在理解偏移量的版本了。这是否意味着如果我使用0x8051d0调用r/m32,如果地址保持不变,它将获得相同的结果?是的,如果首先将地址移动到寄存器中。这是呼叫绝对地址的标准方式。好的,非常感谢
gcc -m32 -static -o test -O0 -ggdb test.c -fno-stack-protector -Wno-format-security