use*_*550 1 c operating-system system-calls object-files
我希望了解程序集级别的printf()语句.但是,大多数汇编程序执行的操作类似于调用外部打印函数,其依赖性由链接器添加的其他目标文件满足.我想知道在打印函数内部的系统调用和非常基本的汇编代码.我想要一个汇编代码,其中唯一的外部调用是系统调用,对于printf.我在考虑类似于已组装的目标文件.我在哪里能得到类似的东西?
我建议改为先保持C级,并研究 Linux上现有的一些C标准库自由软件实现的源代码.查看musl-libc或GNU libc(aka glibc)的源代码.您将理解几个中间(通常是内部)函数printf在基本系统调用和syscalls(2)中列出的函数之间是有用的.在样本C程序上也使用strace(1)printf (例如通常的hello-world示例).
特别是,musl-libc 有一个非常易读的stdio/printf.c实现,但在到达write(2)系统调用之前,你需要遵循其他几个C函数.请注意,涉及一些缓冲.另见setvbuf(3)&fflush(3).几个答案(例如,这个和那个)解释了函数printf和系统调用之间的链(直到内核代码).
我想要一段汇编代码,其中唯一的外部调用是系统调用
printf
如果你想正是这样,你可能会从开始MUSL-libc中的标准输入输出/ printf.c,从增加任何额外的源文件MUSL-libc中,直到你有没有更多的外部不确定的符号,并编译所有的人都用gcc -flto -O2也或许-S,你可能会以对象(或汇编)形式完成musl-libc的重要部分(因为printf可能会调用malloc和许多其他函数!)......我不确定它是否值得痛苦.
您也可以静态链接您的libc(例如libc.a).然后链接器将仅链接printf(和您正在调用的任何其他函数)所需的静态库成员.
要挑剔,系统调用实际上不是外部调用(你的libc write函数实际上是原始系统调用的一个小包装).你可以使用SYSENTER机器指令制作它们(但最好使用vdso(7):更便携,也许更快),你甚至不需要有效的堆栈指针(在x86_64上)来进行系统调用.
你甚至可以在不使用的情况下编写Linux用户级程序libc; Scheme 的骨架实现就是这样一个程序(你会发现其他程序).
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |