为什么可执行文件依赖于glibc?

时间:2014-12-31 16:20:46

标签: rust

是因为Rust标准库通过glibc调用内核系统调用吗?但是在Rust本身编写系统调用包装器并不难吗?

2 个答案:

答案 0 :(得分:6)

当一种语言基于C库时,其库调用通常如下所示:

Language API -> C API -> System API

当一种语言不使用C库时,它的库直接调用委托给系统API:

Language API -> System API

当您在中间使用C API时,语言API的实现将更容易编写,因为您几乎不需要编写任何特定于操作系统的代码。反过来,这可以使语言更容易跨平台 - 您可以委托跨平台C库,而不是考虑如何使用具体的平台特定功能。

原则上,Rust中没有任何内容可以防止您丢弃C库并直接使用系统调用。正如你所注意到的,Go正是这样做的。但是,对于libc的依赖并不认为Rust开发人员在标准库中编写大量特定于平台的代码是合理的。

答案 1 :(得分:3)

库/二进制文件不应直接调用系统调用,而应始终调用相应的函数:

  • 只要实现了合适的低级库,二进制文件就可以在不同的操作系统上运行;
  • 您可以使用LD_PRELOAD livrary覆盖库函数。

POSIX在library (function) level定义API,但不强制要求任何类型的系统调用约定。

例如,Wine项目通过提供在本机libc之上实现Windows API的库来运行Windows程序。如果您有一个程序进行直接的Windows系统调用,Wine将无法执行任何操作,因为Wine不实现系统调用,而只实现库级别的Windows API。

此外,Rust在libc和其他库中调用了许多其他东西:

  • mallocfree
  • pthread_mutexpthread_cond;
  • strcmpstrlenstrncpy;
  • qsortbsearch