我需要追踪eglibc-2.13中实现的双重罪(双x)究竟是多少.我下载了源代码,唯一有意义的部分是__sin函数,这是特定于平台的.它是我在/usr/lib/i386-linux-gnu/libm.a中所拥有的核心吗?
如何追踪从sin()到__sin()的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断使用哪种实现的方式.该架构的i386.
解决方法:
(e)glibc构建过程是黑色,黑色魔法.你不想试图理解它.但是,glibc遵循每个公共函数的一个文件编码样式,所以一般来说,如果你有源代码树,并且想要找到某个函数的实现,那么最简单的事情就是
$find * -name '*function*' -print
当然,从顶层,用函数名称替换函数.
具体谈论罪:数学函数的通用实现在数学目录中:但是,似乎没有罪的通用定义.所以接下来要看的是sysdeps.非通用的所有内容都在sysdeps中,特别是sysdeps / ieee754是所有数学函数都依赖于IEEE 754浮点规范但没有其他系统依赖性的地方.此目录按类型组织:sysdeps / ieee754 / dbl-64包含IEEE double的所有数学函数.在这里你会找到sysdeps/ieee754/dbl-64/s_sin.c
,这是你要找的代码. (所有这些文件上的e_,s_,k_等前缀用于表示AFAIK不再使用的内容.)
如果在特定处理器的汇编语言中有一个sin的实现,它将在sysdeps中的其他地方名为sin.S(或可能是s_sin.S)的文件中.但是,似乎没有一个.