linux-libc源代码中的open()是从哪里链接的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-libc源代码中的open()是从哪里链接的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1739字,纯文字阅读大概需要3分钟。
内容图文
![linux-libc源代码中的open()是从哪里链接的?](/upload/InfoBanner/zyjiaocheng/946/73205684286e4bde80ed674753c8095c.jpg)
我基本上需要自定义几个linux系统调用接口(例如sys_open).我非常了解GNU Linker ld –wrap = symbol选项,并使用该逻辑来更改open()libc包装器.尽管这达到了目的,但我真的很想知道libc源代码中的实际实现在哪里.
以下是我的主要怀疑对象(请注意,fcntrl.h仅包含声明)
> GLIBC_DIR / io / open.c
> GLIBC_DIR / ports / sysdeps / unix / sysv / linux / generic / open.c
样本驱动程序:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd;
if ((fd = open("sample.c", O_RDONLY)) == -1) {
fprintf(stderr, "file not found\n");
exit(1);
}
return 0;
}
有关摘要:
main:
401dd1: bf 44 90 48 00 mov $0x489044,%edi
401dd6: b8 00 00 00 00 mov $0x0,%eax
401ddb: e8 10 03 03 00 callq 4320f0 <__libc_open>
......
......
__libc_open:
4320f0: 83 3d 69 8e 28 00 00 cmpl $0x0,0x288e69(%rip)
4320f7: 75 14 jne 43210d <__open_nocancel+0x14>
__open_nocancel:
4320f9: b8 02 00 00 00 mov $0x2,%eax
4320fe: 0f 05 syscall
为简单起见,我准备了所有可静态执行的libc源.还足够小心,以使GCC正确选择自定义libc.a.我尝试添加一个puts语句,但是提到的两个源代码根本没有被调用.看一下可执行文件的汇编[如上所示],已将sys_open调用(__open_nocancel中的0x2)放置在可执行文件中.
所以我的问题是:
>在libc中,与open()相关的代码逻辑从何而来?
>当libc源代码树中没有显式命名为open的链接器时,链接器如何成功钩住open()函数?
解决方法:
From where exactly in libc, the open()-related code logic magically come?
输入来自sysdeps / unix / syscall-template.S
How is the linker able to successfully hook the open() function when there is no function explicitly named open in libc source tree?
如果使用正确的-DSYSCALL_SYMBOL = …预处理上述源代码,则会发现源代码中提到了open.
内容总结
以上是互联网集市为您收集整理的linux-libc源代码中的open()是从哪里链接的?全部内容,希望文章能够帮你解决linux-libc源代码中的open()是从哪里链接的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。