为什么glibc库使用汇编

时间:2018-08-16 19:53:57

标签: c gcc assembly glibc

我正在查看此页面:https://sys.readthedocs.io/en/latest/doc/01_introduction.html
这将解释glibc如何进行系统调用。
在其中一个示例中,对代码进行了检查,结果表明,glibc所做的最后一条指令实际上是 进行系统调用(意味着对CPU的中断)是用汇编语言编写的。 ...为什么在汇编中加入glibc?通过在装配中编写一小部分零件是否有某种优势?
此外,在运行时共享库​​是否已编译为机器代码正确?
那么,为什么在编译之前使用两种不同的语言会有什么优势呢?谢谢。

2 个答案:

答案 0 :(得分:8)

答案非常简单-因为C不覆盖系统调用(因为它通常不覆盖任何物理硬件,并且更喜欢用抽象机表达自己),所以没有C构造{{1 }}可用于执行系统调用。

有人认为编译器可以提供某种内在的功能,但是由于在Linux中glibc实际上是编译器工具套件的一部分(也包含CRT),因此glibc确实不需要它工作。

最后,但并非最不重要的是,在现代CPU中,系统调用通常不是中断。而是一条特定的指令(x86_64中的glibc)。

答案 1 :(得分:3)

我想解决您的这一部分问题:

  

此外,在运行时共享库​​是否已编译为正确的机器代码?   那么为什么在编译之前使用两种不同的语言会有什么优势呢?

SergeyA正确地指出,没有 任何C结构(即使具有GCC的所有扩展名)也会导致编译器发出一条syscall指令。这不是C库应该做的唯一不能完全用C语言编写的事情:setjmplongjmpmakecontextsetcontext的实现,调用main的“入口点”代码,从信号处理程序返回时返回的“蹦床”以及其他几个低层位都需要一点手写组装。 (锻炼:它们有什么共同点?)

但是还有另一个原因需要将汇编语言混合到主要用C。This is one of the several implementations of memcpy for x86-64 in glibc编写的程序中。它是3100行的手写汇编语言和预处理器宏。它的作用可以用C的四行表示。为什么有人会遇到那么大的麻烦? 速度。编译器总是越来越近,但是在将每个可能的周期从关键的最内层循环中挤出时,它们还没有完全击败人脑。 (值得一提的是,在2018年初,glibc开发人员花了很多时间用C替换math.h函数的手写汇编实现,因为编译器已经赶上了这些,并且C更具可维护性。)

第三个答案与glibc并不特别相关,但在其他地方也有很多答案,那就是也许您的程序中有两种不同的语言,因为它们中的每一种都可以更好地解决您的问题。统计语言R主要是用C实现的,但是它的许多数学原语都是(或者曾经有一段时间没有检查过)用FORTRAN编写的,因为FORTRAN仍然是数值计算向导认为的语言。和FORTRAN被编译成机器代码,原则上您可以 用C重写所有的FORTRAN,但是没人愿意。