知名三方库的编译方法

一、OpenSSL 调试 debug 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git clone https://github.com/openssl/openssl.git
cd openssl

# 安装静态库
./config --prefix=/usr/local --openssldir=/usr/local/ssl
make -j10 && sudo make install

# 安装动态库。安装动态库时增加 -d 选项,调试时使用动态库,达到跟踪代码的需求
./config -d shared --prefix=/usr/local --openssldir=/usr/local/ssl
make -j10 && sudo make install

# aarch64
# --cross-compile-prefix 交叉编译器前缀
# no-asm 不使用汇编代码。由于是交叉编译,如不使用该选项,会出现汇编指令不识别的问题,因为 openssl 默认使用的汇编指令为 x86 平台下的指令,而一般的交叉编译器使用 ARM 平台下的交叉编译器
./Configure linux-aarch64 --prefix=xxx --cross-compile-prefix=aarch64-linux-gnu- -no-asm shared --debug

二、libcurl 调试 debug 方法

1
2
3
4
5
6
7
8
https://curl.se/download/

# 使用 --enable-debug 调试的时候可以达到跟踪代码的需求
# --without-nss 是因为自带的 curl 支持的 https 是 nss 版本,不是 openssl 的,我们需要用 openssl 版本的
# 可以使用 curl -V 查看
# --with-ssl 指定 openssl 的安装位置
sudo ./configure --enable-debug --prefix=/usr/local --without-nss --with-ssl=/usr/local
sudo make && sudo make install

三、编译 libasan 库

非正规的做法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 下载 gcc 源码
https://gcc.gnu.org/

# 修改 libstdc++-v3 和 libsanitizer 下 configure
if test "$srcdir" = "."; then
if test "$with_target_subdir" != "."; then
multi_basedir="$srcdir/$with_multisrctop../.."
else
multi_basedir="$srcdir/$with_multisrctop.."
fi
multi_basedir="$srcdir/.." # 增加这一句代码
else
multi_basedir="$srcdir/.."
fi

# 编译,先编译 libstdc++-v3 ,再编译 libsanitizer。存在依赖关系
# 注意如果编译 aarch64 版本,需要安装 aarch64 版本的 gcc 交叉编译器
x86: ./configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-multilib
aarch64: ./configure --prefix=/opt/xxx/xxx_aarch64_gcc_7.5.0xxx --host=aarch64-linux-gnu --target=aarch64-linux-gnu --disable-multilib
make -j8 -nostdinc++ -nostdlib++ && sudo make install

# 编译完之后,lib 文件
libstdc++-v3: src/.libs/ 目录下
libsanitizer: asan/.libs/ 目录下

# 问题记录
1. cassert:没有那个文件或目录 #include <cassert>
https://reviews.llvm.org/D88922?id=301203
make 的时候增加 -nostdinc++ -nostdlib++

asan:内存地址问题。 lsan:内存泄漏问题。 Tsan:线程内存问题

四、编译 coreutils 代码

linux 中一些简单的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载源码
git clone git://git.sv.gnu.org/coreutils

sudo ./bootstrap
如果遇到报错 no-check-certificate 的问题。打开 bootstrap 代码,在 wget 中加上参数 --no-check-certificate

# --disable-gcc-warnings 禁用所有警告
sudo ./configure CC="gcc" CXX="g++" CFLAGS="-g -O0" CXXFLAGS="-g -O0" FORCE_UNSAFE_CONFIGURE=1 --disable-gcc-warnings

# CFLAGS='-Wno-error=suggest-attribute=const' 不要将警告视为错误
sudo make -j10 CFLAGS='-Wno-error=suggest-attribute=const'

使用 readelf -S src/ls 查看是否带上 debug 信息

五、编译 glibc 源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 必须创建 build 编译目录
mkdir build
cd build

# 生成配置文件
# libc_cv_forced_unwind=yes 即 force-unwind 支持是可用的,不需要进行测试
# –disable-multilib 只产生对应的64位的库
# –build=$MACHTYPE 编译程序的主机x86_64-pc-linux-gnu
# 注意一定要指定 prefix,默认的地址为 /usr/local,可能会导致本机环境不可用
sudo ../configure --build=$MACHTYPE --prefix=xxx --host=aarch64-linux-gnu --target=aarch64-linux-gnu --disable-multilib libc_cv_forced_unwind=yes

../configure --build=$MACHTYPE --prefix=/home/noahyzhang/code/target/x86_64/glibc_2.27 --disable-multilib libc_cv_forced_unwind=yes --enable-debug=yes


sudo make -j10