一、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