Не удалось загрузить ibcrypto.so.3 с использованием локально скомпилированного OpenSSL - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующее Makefile:

CC=mpicc

# use headers from builds/openssl
CFLAGS := -g -I${CURDIR}builds/openssl/include/openssl

# look for library in builds/openssl
LDFLAGS := -L${CURDIR}builds/openssl/lib
LIBS    := -lcrypto -lssl

.PHONY: all
all: builds/main

builds:
    mkdir -p $@

builds/main: builds/dh.o builds/message.o
builds/main: main.c
    $(CC) $(CFLAGS) -o $@ $< builds/dh.o builds/message.o $(LDFLAGS) $(LIBS)

builds/dh.o: dh.h
builds/dh.o: dh.c
    $(CC) $(CFLAGS) -o $@ -c $<

builds/message.o: message.h
builds/message.o: message.c
    $(CC) $(CFLAGS) -o $@ -c $<

builds/dh.o builds/message.o builds/main: builds

# if you want to build openssl with your makefile...
builds/dh.o builds/message.o builds/main: builds/openssl
builds/openssl: builds
    cd openssl && ./config --prefix=${CURDIR}/builds/openssl --openssldir=${CURDIR}/builds/openssl && make && make test && make install

.PHONY: run

run: builds/main
    mpirun -quiet -np 3 xterm -hold -e ./builds/main &

.PHONY: debug

debug: builds/main
    mpirun -quiet -np 3 xterm -e gdb ./builds/main

.PHONY: clean

clean:
    rm -rf ./builds

Это успешно компилирует мой код.Но когда я пытаюсь разрушить его с помощью этих команд:

make clean && make run

Приложение запускается, но я получаю следующую ошибку:

. / Builds / main: ошибка при загрузке общих библиотек: libcrypto.so.3: невозможно открыть общий объектный файл "Нет такого файла или каталога

Я попытался изменить Makefile следующим образом:

CC=mpicc

# use headers from builds/openssl
CFLAGS := -g -I${CURDIR}builds/openssl/include/openssl

# look for library in builds/openssl
LDFLAGS := -L${CURDIR}builds/openssl/lib
LIBS    := -lcrypto -lssl

.PHONY: all
all: builds/main

builds:
    mkdir -p $@

builds/main: builds/dh.o builds/message.o
builds/main: main.c
    $(CC) $(CFLAGS) -o $@ $< builds/dh.o builds/message.o $(LDFLAGS) $(LIBS)

builds/dh.o: dh.h
builds/dh.o: dh.c
    $(CC) $(CFLAGS) -o $@ -c $<

builds/message.o: message.h
builds/message.o: message.c
    $(CC) $(CFLAGS) -o $@ -c $<

builds/dh.o builds/message.o builds/main: builds

# if you want to build openssl with your makefile...
builds/dh.o builds/message.o builds/main: builds/openssl
builds/openssl: builds
    cd openssl && ./config --prefix=${CURDIR}/builds/openssl --openssldir=${CURDIR}/builds/openssl && make && make test && make install

.PHONY: run

run: builds/main
    mpirun -quiet -np 3 xterm -hold -e ./builds/main &

.PHONY: debug

debug: builds/main
    mpirun -quiet -np 3 xterm -e gdb ./builds/main

.PHONY: clean

clean:
    rm -rf ./builds

И не смогвообще скомпилировать:

main.c: In function ‘main’:
main.c:76:10: warning: implicit declaration of function ‘DH_get0_pub_key’ [-Wimplicit-function-declaration]
   pubKey=DH_get0_pub_key(secret);
          ^
main.c:76:9: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
   pubKey=DH_get0_pub_key(secret);
         ^
main.c:125:5: warning: implicit declaration of function ‘DH_get0_p’ [-Wimplicit-function-declaration]
   p=DH_get0_p(secret);
     ^
main.c:125:4: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
   p=DH_get0_p(secret);
    ^
/tmp/ccgccndI.o: In function `main':
/home/pcmagas/Kwdikas/master_thesis/mpi_dh/main.c:76: undefined reference to `DH_get0_pub_key'
/home/pcmagas/Kwdikas/master_thesis/mpi_dh/main.c:125: undefined reference to `DH_get0_p'
builds/dh.o: In function `generateKeys':
/home/pcmagas/Kwdikas/master_thesis/mpi_dh/dh.c:20: undefined reference to `DH_set0_pqg'
builds/dh.o: In function `generateKeyFromPreviousParticipant':
/home/pcmagas/Kwdikas/master_thesis/mpi_dh/dh.c:136: undefined reference to `DH_get0_priv_key'
/home/pcmagas/Kwdikas/master_thesis/mpi_dh/dh.c:147: undefined reference to `DH_get0_p'
collect2: error: ld returned 1 exit status
Makefile:18: recipe for target 'builds/main' failed

Значение по сравнению с исходным результатом вообще не видит библиотеку, а при первой ошибке мой проект успешно компилируется, но не загружает динамическую библиотеку.

OpenSSL загружается через подмодуль git, как было в этом вопросе , чтобы избежать использования возможно устаревшей его версии.

Так, как я могу сказать в первом случае для загрузкидинамическая библиотека или даже как я могу собрать OpenSSL как статическую библиотеку / (ries)?

1 Ответ

0 голосов
/ 06 февраля 2019

Не похоже, что вы добавили путь поиска динамических библиотек в ваш исполняемый файл.Посмотрите на флаг ссылки -rpath.Скорее всего, вам нужно будет добавить что-то вроде -Wl,-rpath,${CURDIR}/builds/openssl/lib в ваши флаги ссылки.

...