我需要跟踪double sin(double x)是如何在eglibc-2.13中实现的。我下载了源代码,唯一有意义的部分是__sin函数,它是特定于平台的。它是我在/usr/lib/i 386-linux-gnu/libm.a中的核心吗?
如何跟踪从sin()到__sin()的宏定义?我真正需要的是真正需要的是确切的代码(文件名和行就足够了),以及构建过程推断要使用的实现的方式。该体系结构为i386。
发布于 2012-10-31 01:19:35
(E)滑翔机的建造过程是黑色的黑魔法。你不想尝试去理解它。但是,glibc遵循每个公共函数的一个文件编码风格,因此通常,如果您有源树,并且希望找到某个函数的实现,那么最简单的方法是:
$ find * -name '*function*' -print当然,从顶层开始,用函数的名称替换function。
具体谈到sin:数学函数的泛型实现在math目录中:但是,似乎没有sin的泛型定义。接下来要看的是sysdeps。所有非泛型的东西都在sysdeps中,特别是在sysdeps/ieee754中,所有对IEEE754浮点规范有一定依赖的数学函数都在这里活动,但没有其他系统依赖项。这个目录是按类型组织的:sysdeps/ieee754/dbl-64包含IEEE double的所有数学函数。在这里,您将找到sysdeps/ieee754/dbl-64/s_sin.c,这是您要寻找的代码。(所有这些文件上的e_、s_、k_等前缀过去都意味着什么,但AFAIK已经不再意味着什么了。)
如果在特定处理器的汇编语言中有一个sin的实现,那么它将在一个名为sin.S (或者可能是s_sin.S)的文件中,在sysdeps的其他地方。不过,似乎并没有出现这种情况。
发布于 2012-10-31 22:31:55
不是一个答案,而是一些背景:
在C代码中使用sin()或cos()时,提供实现的几乎肯定是编译器,而不是C库。举个例子,看看GCC提供的建筑清单。链接页面还描述了使用内置版本的情况,而不是C库提供的版本。
https://stackoverflow.com/questions/13149697
复制相似问题