Openssl库与调试符号

时间:2015-04-10 17:39:29

标签: debugging openssl static-libraries

我最近从源代码构建了openssl-1.0.1l(带有调试符号)。我写了一个C程序,它使用openssl库函数执行一些基本的加密。运行可执行文件以及结果时,它会向stdout显示一些信息(如下所示)。

Ending BN_CTX_start 
(0x9b03300): 008 001 001 001
   : ^^^         ^^^ 
Starting BN_CTX_get
(0x9b03300): 008 001 001 001 
   : ^^^         ^^^ 
Starting BN_CTX_end
(0x9b03300): 008 001 001 001 010 
   : ^^^         ^^^ 
Ending BN_CTX_end
(0x9b03300): 008 001 001 001 
   : ^^^ 
Starting BN_CTX_end
(0x9b03300): 008 001 001 001 
   : ^^^ 
Ending BN_CTX_end
(0x9b03300): 
   : 
BN_CTX_free, stack-size=32, pool-bignums=16
dmaxs: 08 01 01 01 10 00 00 00 00 00 00 00 00 00 00 00

这些“额外”信息是什么?为什么要输出?有没有办法禁用它?我要求我的可执行文件只执行它要执行的操作。

这是代码的一部分。这段代码足以导致上述问题:

#include <openssl/ecdsa.h>
#include <openssl/obj_mac.h>

int main()
{
    EC_KEY *keyPair = EC_KEY_new();
    EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_sect163k1);
    EC_KEY_set_group(keyPair, curve);
    EC_KEY_generate_key(keyPair);
}

3 个答案:

答案 0 :(得分:3)

如果查看crypto/bn/bn_ctx.c文件,可以看到消息是BN_CTX_DEBUG预处理程序指令的结果。

默认情况下禁用。您使用哪个命令配置OpenSSL构建?如果您只需要调试符号,请尝试./config -d

答案 1 :(得分:2)

  

我尝试使用-UBN_CTX_DEBUG标志进行配置。

打开Configure。找到表格条目:

"debug",    "gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG 
  -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes 
  -Wmissing-declarations -Werror::(unknown)::-lefence::::",

删除-DBN_CTX_DEBUG。您应该将-g2更改为-g3,以便保留符号定义。

然后,./Configure debug


  

带有调试符号的Openssl [1.0.2]库

我发现最简单的方法就是....

首先,make clean && make dclean整理并删除递归的makefile。

其次,打开Makefile.org并将CFLAG= -O更改为CFLAG= -Og -g3(或CFLAG= -O0 -g3,如果GCC 支持-Og)。

第三,打开Configure并复制一个预先存在的配置目标(如linux-generic64)。将其重命名为my-config。删除与-Ox-gX相关的任何内容(或在其中添加-Og -g3)。同时删除-fomit-frame-pointer

等内容

第四,使用您的配置:

./Configure my-config
make
make install

作为替代方法,请选择开发人员之一的预配置配置。例如,Ben Laurie是开发人员,您可以使用./Configure debug-ben-no-opt。它使用-O0 -g3构建。


同样值得注意的是,Configure中的配置表已经在OpenSSL Master中消失了(预计会有1.1.0及以上的内容)。

您拥有的是Configurations文件夹。在该文件夹中,您有10-main.conf之类的CONF文件,其条目如下:

%targets = (
    ...
    ##### MacOS X (a.k.a. Darwin) setup
    "darwin-common" => {
        template         => 1,
        cc               => "cc",
        cflags           => "",
        debug_cflags     => "-g -O0",
        release_cflags   => "-O3",
        thread_cflag     => "-D_REENTRANT",
        sys_id           => "MACOSX",
        lflags           => "-Wl,-search_paths_first%",
        bn_ops           => "BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR",
        perlasm_scheme   => "osx32",
        dso_scheme       => "dlfcn",
        shared_target    => "darwin-shared",
        shared_cflag     => "-fPIC -fno-common",
        shared_ldflag    => "-dynamiclib",
        shared_extension => ".\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
    },
    ...
    "darwin-i386-cc" => {
        inherit_from     => [ "darwin-common", asm("x86_asm") ],
        cflags           => "-arch i386 -DL_ENDIAN",
        release_cflags   => "-O3 -fomit-frame-pointer",
        bn_ops           => "BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR",
        perlasm_scheme   => "macosx",
        shared_ldflag    => "-arch i386 -dynamiclib",
    },
    "darwin64-x86_64-cc" => {
        inherit_from     => [ "darwin-common", asm("x86_64_asm") ],
        cflags           => "-arch x86_64 -DL_ENDIAN -Wall",
        bn_ops           => "SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL",
        perlasm_scheme   => "macosx",
        shared_ldflag    => "-arch x86_64 -dynamiclib",
    },
);

我实际上遭受了类似的痛苦,但在1.1.0(主人)与Clang及其消毒剂相似。这是我的破解99-clang-sanitize.conf尝试与您正在做的事情类似(修改CFLAGS):

%targets = (
    "darwin-sanitize-x86_64" => {
        sys_id           => "MACOSX",
        # inherit_from     => [ asm("x86_64_asm") ],    
        cc               => "clang",
        cflags           => "-g3 -O1 -fPIC -Wall -fsanitize=undefined -fsanitize=address -arch x86_64 -DL_ENDIAN",
        lflags           => "-arch x86_64",
        bn_ops           => "SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL",
        thread_cflag     => "-D_REENTRANT",
        # perlasm_scheme   => "osx64",
        dso_scheme       => "dlfcn",
        # engines_obj     => "e_padlock-x86_64.o"       
    },
    "darwin-sanitize-i386" => {
        sys_id           => "MACOSX",
        # inherit_from     => [ asm("x86_asm") ],   
        cc               => "clang",
        cflags           => "-g3 -O1 -fPIC -Wall -fsanitize=undefined -fsanitize=address -arch i386 -DL_ENDIAN",
        lflags           => "-arch i386",
        bn_ops           => "BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR",
        thread_cflag     => "-D_REENTRANT",
        # perlasm_scheme   => "osx32",
        dso_scheme       => "dlfcn",
        # engines_obj     => "e_padlock-x86.o"
    },
);

答案 2 :(得分:1)

这些是我使用调试符号安装openssl-1.0.1l并且没有额外信息时所遵循的确切步骤:

  1. 当我运行config -d命令时,输出的最后一行显示为debug-linux-elf配置。在Configure文件中,我通过删除-DBN_CTX_DEBUG更改了 debug-linux-elf 的表条目。
  2. 我没有更改该特定表条目中的-g标志。
  3. 运行以下内容:
    ./config -d
    make
    make test
    sudo make install
  4. 问题似乎已得到解决。谢谢@jww的答案。