我需要追踪double sin(double x)
在 eglibc-2.13 中究竟是如何实现的。我下载了源代码,唯一有意义的部分是 __sin 函数,它是特定于平台的。它是我在 /usr/lib/i386-linux-gnu/libm.a 中的核心吗?
如何追踪从 sin() 到 __sin() 的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断要使用哪个实现的方式。架构的 i386。
(e)glibc 构建过程是黑魔法。你不想尝试去理解它。然而,glibc 坚持一个文件一个公共函数的编码风格,所以一般来说,如果你有源代码树并且你想找到某个函数的实现,最简单的事情是
$ find * -name '*function*' -print
从顶层function
开始,当然是用函数的名称替换。
具体来说sin
:数学函数的通用实现在math
目录中:但是,似乎没有通用定义sin
。所以下一个要看的地方是sysdeps
。所有不通用的东西都在 中sysdeps
,特别sysdeps/ieee754
是所有数学函数都依赖于 IEEE 754 浮点规范,但没有其他系统依赖关系的地方。此目录按类型组织:sysdeps/ieee754/dbl-64
包含 IEEE 的所有数学函数double
。在这里你会找到sysdeps/ieee754/dbl-64/s_sin.c
,这是你正在寻找的代码。(所有这些文件上的e_
, s_
, k_
, 等前缀曾经意味着某些东西,但 AFAIK 不再有意义。)
如果有sin
针对特定处理器的汇编语言实现,它将位于名为sin.S
(或可能s_sin.S
)的文件中sysdeps
。不过,似乎没有。
不是答案,只是一点背景:
当您在 C 代码中使用sin()
或cos()
时,几乎可以肯定是编译器提供了实现,而不是您的 C 库。例如,查看GCC 提供的内置函数列表。链接页面还描述了使用内置函数而不是 C 库提供的版本的情况。