-- mode: Outline --
这是 unwind 库的 1.0 版本。该库支持以下多种架构/操作系统组合:
Linux/x86-64: 运行良好。 Linux/x86: 运行良好。 Linux/ARM: 运行良好。 Linux/IA-64: 经过全面测试并受支持。 Linux/PARISC: 运行良好,但 C 库缺少 unwind-info。 HP-UX/IA-64: 大部分功能正常,但已知存在一些严重限制。 Linux/AArch64: 新增。 Linux/PPC64: 新增。 Linux/SuperH: 新增。 FreeBSD/i386: 新增。 FreeBSD/x86-64: 新增(FreeBSD 架构称为 amd64)。
通常,可以通过以下命令构建并安装此库:
$ autoreconf -i # 仅从 git 构建时需要。依赖 libtool。
$ ./configure
$ make
$ make install prefix=PREFIX
其中 PREFIX 是安装前缀。默认使用前缀 /usr/local,因此 libunwind.a 安装至 /usr/local/lib,unwind.h 安装至 /usr/local/include。对于测试,你可能希望使用 /usr/local 作为前缀。
** 版本 8 及更高版本
从版本 8 开始,IA-64 Intel 编译器的首选名称为 "icc"(与 x86 上的名称相同)。因此,configure 命令应如下所示:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
目前,libunwind 必须在 HP-UX 上使用 GCC 构建。
libunwind 应在 HP-UX 上按如下方式配置和安装:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
注意事项:当前不支持对 32 位(ILP32)二进制文件的展开。
** 旧版本 GCC 的解决方法
GCC v3.0 和 GCC v3.2 附带了一个有问题的 sys/types.h 版本。解决方法是在运行 "configure" 之前执行以下命令:
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 及更高版本已修复此问题,无需此解决方法。
要为 power64 构建,应使用:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
如果你的 Power 支持 altivec 寄存器: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
检查处理器是否支持向量寄存器(altivec): cat /proc/cpuinfo | grep altivec 并且应该显示类似如下内容: cpu : PPC970, altivec supported
如果 libunwind 似乎无法正常工作(回溯失败),尝试使用 -O0(无优化)进行编译。某些编译器问题取决于你的 gcc 版本。
通用构建说明适用。要构建并执行多个测试,你需要 libexecinfo 库,该库可在 ports 中的 devel/libexecinfo 获得。
该端口的开发工作是在 FreeBSD 8.0-STABLE 上完成的。该库使用系统编译器(gcc 4.2.1 的修改版本)以及 gcc 4.4.3 构建。
构建库后,你可以使用以下命令运行一组回归测试:
$ make check
** IA-64 Linux 上的预期结果
除非你安装了非常新的 C 库和编译器,否则目前预计以下测试在 IA-64 Linux 上会失败:
Gtest-init (从 glibc-2.3.x/gcc-3.4 开始应通过)
Ltest-init (从 glibc-2.3.x/gcc-3.4 开始应通过)
test-ptrace (从 glibc-2.3.x/gcc-3.4 开始应通过)
run-ia64-test-dyn1 (从 glibc-2.3.x 开始应通过)
这并不意味着 libunwind 不能与较旧的编译器或 C 库一起使用,只是对于某些极端情况,展开将失败。由于它们是极端情况,应用程序不太可能触发它们。
注意:如果在 Gia64-test-nat 和 Lia64-test-nat 中遇到大量错误,几乎肯定表明汇编器版本过旧。GNU 汇编器曾错误地编码了前栈指针相对偏移量。此错误已于 2004 年 9 月 21 日修复,因此任何更新版本的汇编器均无问题。
** x86 Linux 上的预期结果
以下测试预计在 x86 Linux 上会失败:
Gtest-resume-sig (无法获取 SIGUSR2)
Ltest-resume-sig (同样)
Gtest-dyn1 (尚不支持动态展开信息)
Ltest-dyn1 (尚不支持动态展开信息)
test-setjmp (longjmp() 尚未实现)
run-check-namespace (尚无 _Ux86_getcontext)
test-ptrace
** x86-64 Linux 上的预期结果
以下测试预计在 x86-64 Linux 上会失败:
Gtest-dyn1 (尚不支持动态展开信息)
Ltest-dyn1 (尚不支持动态展开信息)
Gtest-init(参见 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (同样)
test-async-sig (由于错误的展开信息导致崩溃?)
test-setjmp (longjmp() 尚未实现)
run-check-namespace (尚无 _Ux86_64_getcontext)
run-ptrace-mapper (??? 需要调查)
run-ptrace-misc(参见 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
和 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** PARISC Linux 上的预期结果
注意事项:在 PA-RISC Linux 上需要 GCC v3.4 或更新版本。早期版本的编译器无法生成展开所需的异常处理程序头(GNU_EH_FRAME)。
以下测试预计在 x86-64 Linux 上会失败(应为 PARISC?原文如此,保持):
Gtest-bt (由于缺少展开信息,回溯在 kill() 处被截断)
Ltest-bt (同样)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() 存在某种错误)
Ltest-resume-sig (同样)
Gtest-init (同样)
Ltest-init (同样)
Gtest-dyn1 (尚不支持动态展开信息)
Ltest-dyn1 (尚不支持动态展开信息)
test-setjmp (longjmp() 尚未实现)
run-check-namespace (工具链尚不支持 HIDDEN)
** HP-UX 上的预期结果
"make check" 目前不支持 HP-UX。你可以尝试运行它,但大多数测试都会失败(有些可能无法终止)。目前已知能工作的测试程序只有:
tests/bt
tests/Gperf-simple
tests/test-proc-info
tests/test-static-link
tests/Gtest-init
tests/Ltest-init
tests/Gtest-resume-sig
tests/Ltest-resume-sig
** PPC64 Linux 上的预期结果
"make check" 运行时,失败的测试数应不超过 24 中的 10 个。
此发行版包含几个简单的性能测试,可以大致了解各种 libunwind 操作的基本开销。构建库后,你可以使用以下命令运行这些测试:
$ cd tests $ make perf
所有关于此库的问题请直接发送至:
你可以通过向 [email protected] 发送邮件,并在正文中写入以下内容来实现:
subscribe libunwind-devel
或者你也可以通过以下网页界面订阅并管理你的订阅:
https://savannah.nongnu.org/mail/?group=libunwind