从汇编代码调用库中的 C 函数

Posted

技术标签:

【中文标题】从汇编代码调用库中的 C 函数【英文标题】:Calling C function in library from assembly code 【发布时间】:2013-07-18 16:18:49 【问题描述】:

我需要在我的 nasm 程序中调用不同 C 库中的一些函数。

图书馆:

 <sys/ptrace.h>
 <sys/wait.h>

... 以及 ptrace、execl、wait 等函数。

How to use c library function fgets in assembly language?

【问题讨论】:

图书馆: / / ... 功能:等待,ptrace,... 您可以将信息编辑到您的问题中,无需在cmets中添加。 哦,好的,我明白了。你在&lt;&gt; 中有文本,但它没有被标记为代码。为您重新格式化。 How do I use C libraries in assembler?的可能重复 【参考方案1】:

通常有两种方法可以从汇编程序中使用 C/或任何其他 HLL 函数:

    静态链接 - 如果您使用链接器,您可以将您的程序与所需的 HLL 生成的 .obj 或 .lib 文件和

    链接在一起

    动态链接 - 您的程序在加载期间链接到所需的函数,而不是在编译期间。有两种可能的实现方式:

    2.1。手动加载动态库并获取所需函数的地址。为此,您必须使用操作系统提供的服务。例如在 Linux 中,这是 sys_uselib(已经过时了),或者自己加载库并解析 ELF 文件以获取函数地址;

    2.2。构建包含要使用的库和函数列表的导入表。然后操作系统加载器会自动在占位符变量中提供函数的地址,您可以从中间接调用它们。

所有这些方法都高度依赖于操作系统和汇编程序,所以我只能为汇编程序提供示例I use:

Import macros 用于为 Linux 构建导入表的 FreshLib。

The same for Windows

Example of use for the library "libc.so" in Linux

Example of use for the library "user32.dll" in Windows

【讨论】:

Linux uselib 系统调用用于“旧的a.out”可执行格式——Linux 在采用 ELF 之前使用的格式。每个人都应该在至少 15 年前停止使用它。 @WumpusQ.Wumbley - 好吧,它在某些系统上仍然可用,但恕我直言,使用起来很痛苦。 :)

以上是关于从汇编代码调用库中的 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C 调用汇编函数时出现分段错误错误

c语言中函数调用的本质从汇编角度分析

汇编语言中的函数调用

Linux AMD64 从复制的程序集中调用 C 库函数

汇编语言中invoke函数 各参数的含义

从汇编角度来理解linux下多层函数调用堆栈运行状态