【问题标题】:Why is stdout in libc?为什么标准输出在 libc 中?
【发布时间】:2018-05-08 14:04:18
【问题描述】:

问题

为什么二进制文件中的 stdout 变量会链接到 libc 地址?

这个特定的 libc 地址是什么?

【问题讨论】:

  • 你认为它应该在哪里?这是 libc 提供的东西。这是FILE*。究竟是什么,是一个实现细节。
  • 我希望 stdout FILE* 保存在二进制文件的变量中,因为它不是每个二进制文件都相同,还是我错了?
  • 我的意思是,如果您在两个不同的终端中启动二进制文件,它们是否具有相同的标准输出?所以它不应该在全局范围内位于 libc 中,因为那样两者都将具有相同的标准输出 @Jester
  • 就 libc 而言,它们是相同的标准输出。在类 unix 系统上,stdio 的东西最终会使用文件描述符,stdout 是1。所以FILE* 也可以相同。差异由操作系统本身处理,因为它为每个进程维护一个打开的文件表。

标签: c assembly binary libc


【解决方案1】:

FILE *stdout 指向的 FILE 对象可能会在运行时由 libc 的 init 函数分配,对于像 glibc 这样需要在 main 运行之前调用 init 函数的 libc 实现。

所以它不应该全局存在于 libc 中,因为那样两者都会有相同的标准输出

每个进程都有自己的stdout指针,指向自己的FILE对象,因为共享库的数据部分是私有映射。

使用同一个库的不同进程没有用于读写数据的共享内存。

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 2019-11-22
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多