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