浅谈库函数与系统调用,以fork函数为例

背景

最近,在看unix环境高级编程,第一章就讲了unix下的函数调用结构:


这图其实把结构表达的很清楚,但感觉还是有两个疑问:

  • 库函数是具体是如何调用system call
  • 不通过库函数,我们程序中如何调用system call

追溯

既然要探究库函数本质,那必然得看看库函数的源码,以最新版本的glibc 2.27为例吧
本来之前想从fgets入手的,但整个文件结构实在太大,库函数里面做了不少的处理,还是直接从fork函数入手


看到文件最后有:

可以发现fork被定义到了__libc_fork,看看__libc_fork函数里面并不是像我们想象的那样,直接调用的system call,其库函数里面自身做了一些优化工作,但可以观察到这一句:
INLINE_SYSCALL (fork, 0),字面上看应该就是系统调用了,继续进去再看:

指向了INLINE_SYSCALL1,继续进去

跳到了inline_syscall0,再看

这下终于看到了最终的调用方式,其是通过汇编callsys来进行系统调用的。
到此,其实两个问题也得到了回答:可以通过汇编来实现直接进行系统调用。

总结

其实就验证了库函数与系统调用的关系,要注意的是,目前的glibc太大了,要查找调用关系,其实还挺麻烦的,即使用source insight,搜索也会产生大量的匹配信息,可能还是用libc初始版本比较方便吧

本文链接:https://rainlin.top/archives/127
转载请注明转载自:https://rainlin.top
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇