3

我需要追踪double sin(double x)在 eglibc-2.13 中究竟是如何实现的。我下载了源代码,唯一有意义的部分是 __sin 函数,它是特定于平台的。它是我在 /usr/lib/i386-linux-gnu/libm.a 中的核心吗?

如何追踪从 sin() 到 __sin() 的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断要使用哪个实现的方式。架构的 i386。

4

2 回答 2

5

(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。不过,似乎没有。

于 2012-10-31T01:19:35.367 回答
1

不是答案,只是一点背景:

当您在 C 代码中使用sin()cos()时,几乎可以肯定是编译器提供了实现,而不是您的 C 库。例如,查看GCC 提供的内置函数列表。链接页面还描述了使用内置函数而不是 C 库提供的版本的情况。

于 2012-10-31T22:31:55.920 回答