Debugging 带有调试符号的Openssl库

Debugging 带有调试符号的Openssl库,debugging,openssl,static-libraries,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 : ^^^ ^^^ Sta

我最近从源代码构建了
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);
}
#包括
#包括
int main()
{
EC_KEY*keyPair=EC_KEY_new();
EC_组*曲线=EC_组新名称(NID_sect163k1);
EC_密钥集_组(密钥对、曲线);
EC_密钥_生成_密钥(密钥对);
}

如果查看
crypto/bn/bn_ctx.c
文件,可以看到这些消息是
bn_ctx_DEBUG
预处理器指令的结果


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

如果查看
crypto/bn/bn\u ctx.c
文件,可以看到消息是
bn\u ctx\u DEBUG
预处理器指令的结果

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


我尝试用
-UBN\u CTX\u DEBUG
标志配置它

打开
配置
。查找表条目:

"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\u CTX\u DEBUG
。您可能应该将
-g2
更改为
-g3
,以便也保留符号定义

然后,
/Configure debug


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

我发现最简单的方法是

首先,
makeclean&&makedclean
整理和删除递归生成文件

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

第三,打开
Configure
并复制一个预先存在的配置目标(如
linux-generic64
)。将其重命名为类似于
my config
。删除与
-Ox
-gX
相关的任何内容(或在此处添加
-Og-g3
)。还可以删除诸如
-fomit帧指针
之类的内容

第四,利用您的配置:

./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(master)版本中,我使用了叮当及其消毒液。这是我的坏掉的
99 clangsanitize.conf
,它试图做与您正在做的类似的事情(修改
CFLAGS
):


我尝试用
-UBN\u CTX\u DEBUG
标志配置它

打开
配置
。查找表条目:

"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\u CTX\u DEBUG
。您可能应该将
-g2
更改为
-g3
,以便也保留符号定义

然后,
/Configure debug


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

我发现最简单的方法是

首先,
makeclean&&makedclean
整理和删除递归生成文件

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

第三,打开
Configure
并复制一个预先存在的配置目标(如
linux-generic64
)。将其重命名为类似于
my config
。删除与
-Ox
-gX
相关的任何内容(或在此处添加
-Og-g3
)。还可以删除诸如
-fomit帧指针
之类的内容

第四,利用您的配置:

./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(master)版本中,我使用了叮当及其消毒液。这是我的坏掉的
99 clangsanitize.conf
,它试图做与您正在做的类似的事情(修改
CFLAGS
):


以下是我安装
openssl-1.0.1l
时所遵循的步骤,其中包含调试符号,不包含额外信息:

  • 当我运行
    config-d
    命令时,输出的最后一行显示为调试linux elf配置的。在
    Configure
    文件中,我通过删除
    -DBN\u CTX\u debug
    更改了debug linux elf的表项
  • 我没有更改该特定表条目中的
    -g
    标志
  • 运行以下命令:
    /config-d

    make

    进行测试

    sudo make安装
    这个问题似乎已经解决了。感谢