Ошибка при связывании SSL и криптографических библиотек, установленных в пользовательском расположении - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь создать общую библиотеку, которая должна быть связана с OpenSSL-1.0.2p, который зависит от libssl1.0. Однако установленная версия OpenSSL на моем бионическом компьютере с Ubuntu OpenSSL-1.1.1, которая внутренне использует libssl1.1.

Поскольку я не хочу устанавливать OpenSSL-1.0 для всей системы, я скачал и скомпилировал его отдельно, установив егов папку внутри моего домашнего каталога.

Я хочу использовать это местоположение, с которым я хотел бы связать свою общую библиотеку. Вот Makefile для разделяемой библиотеки, которую я пытаюсь создать:

APPBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
#CFLAGS= -Wall -g -O -fPIC
CFLAGS= -Wall -g -O -static
RM= rm -f
.PHONY: all clean

src=$(wildcard *Generic/*.c *Linux/*.c)
$(info source=$(src))

#we use the custom compiled openssl version
#and NOT the one available on the system
#INC=-I/usr/include/openssl
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl
INC+=$(foreach d,$(incdir),-I$d)
$(info includes=$(INC))

LIB=-L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+=-l:libssl.a -l:libcrypto.a

# looks like we need this for proper static linking of libc
LIB+= -static-libgcc

$(info links=$(LIB))

obj=$(src:.c=.o)

#all: libAPP.so
all: libAPP.a

clean:
    $(RM) *.o *.so
    $(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)

.c.o:
    ${CC} ${CFLAGS} $(INC) -c $< -o $@
    #${CC} ${CFLAGS} $(INC) -c $< -o $@

libAPP.a: $(obj)
    @ar rcs $@ $^ 
    #$(LINK.c) -shared $^ -o $@

Тем не менее, создайте отчеты о том, что включаемые заголовочные файлы взяты из системной установки openssl, и, следовательно, компиляция не удалась (так как онаожидая OpenSSL-1.0.2p). Вот пример:

In file included from /usr/include/openssl/e_os2.h:13:0,
                 from /usr/include/openssl/bio.h:13,
                 from /usr/include/openssl/x509v3.h:13,
                 .... (source file 1)

gcc -static -Wall -g -O -fPIC -I/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/include/openssl -I*/path/to/app/include1* -I*/path/to/app/include2* -c */path/to/src1* -L/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/lib -lssl -lcrypto
sr1.c: In function ‘Get_CACertificates’: warning: implicit declaration of function ‘CRYPTO_w_lock’; did you mean ‘CRYPTO_zalloc’? [-Wimplicit-function-declaration]
             CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
             ^~~~~~~~~~~~~
             CRYPTO_zalloc

CRYPTO_w_lock - это макрос, которого больше нет в последней версии crypto.h (OpenSSL-1.1), который дает понять, что мое приложение все еще смотрит на системную версию OpenSSL.

В мои исходные файлы я включаю файлы заголовков SSL, например, так:

#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

Хотя угловые скобки должны указывать компилятору просматривать файлы заголовков системы, не так ли-L в командной строке, а также флаги -I заставляют его искать их в указанных каталогах, прежде чем просматривать системные файлы?

У меня есть файл crypto.h в пользовательскомместо установки OpenSSL, но компилятор, кажется, почему-то игнорирует егоПожалуйста, скажите мне, что я здесь упускаю

ОБНОВЛЕНИЕ 1 : Как предположил Даррен, удалил трейлинг openssl, так что теперь мой путь включения INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include и альт Iможно увидеть создание общей библиотеки. Однако, когда я пытаюсь найти ссылки на ssl в этой недавно созданной общей библиотеке, я вижу, что у меня есть 87 записей (включая ВСЕ символы, имеющие ssl как часть их имени)

ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm libAPP.so | grep -i "ssl" | wc -l 87

, тогда как перечисление только глобальных символов из libssl.a говорит мне, что в нем 1113 глобально определенных символов.

ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm -g ../OpenSSL-1.0.2p-installation/lib/libssl.a | grep -i "ssl" | wc -l 1113

Разве первый счет не должен быть БОЛЬШЕ , чем второй? Это как-то связано с тем, что мое «приложение» является общей библиотекой? Даже в этом случае он не должен извлекать ВСЕ символы (по крайней мере, глобальные) из любых статических библиотек, с которыми он связывает ??

ОБНОВЛЕНИЕ 2 : Теперь, очевидно,поскольку у меня возникли проблемы с символами SSL, я переключился на создание статической библиотеки, поэтому внес соответствующие изменения в make-файл.

1 Ответ

1 голос
/ 30 октября 2019

В этой строке:

INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl

... попробуйте изменить его на:

INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include

... т.е. без части 'openssl'.

Ваши включения, например,

#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

... ожидают, что пути поиска в каталоге заканчиваются на «include /», а не на «openssl».

...