【问题标题】:What is the proper way of building a static binary with openssl?使用 openssl 构建静态二进制文件的正确方法是什么?
【发布时间】:2018-06-02 21:21:31
【问题描述】:

我有以下make文件:

CC=g++
CFLAGS=-c -Wall
REST_LIBS = -lssl -lcrypto -lboost_system -lcpprest

all: main

main: static_pack
    g++ -std=c++14 -D DEBUG -Wfatal-errors -static -pthread -I$(basepath)/vendors/cpp-jwt/include -I$(basepath)/vendors/json/include \
    -DTS=\"/ctts.json\" \
    -DCS_PATH=\"/bin\" \
    -DCTFS_ENC=\"/ctfs.enc\" \
    -DUNTAR_PATH=\"/\" \
    -DCLUSTER_PATH=\"/.clusters\" \
     -o run main.cpp \
    libmain.a && \
    rm -rf debpkg/cs/usr/bin/cs debpkg/cs.deb && \
    cp run debpkg/cs/usr/bin/cs && \
    dpkg-deb -b debpkg/cs && \
    mv debpkg/cs.deb .

static_pack: rest.o aes.o random.o
    ar rcs libmain.a random.o aes/aes.o rest/rest.o

rest.o:
    g++ -std=c++14 -Wfatal-errors -c $(REST_LIBS) -o rest/rest.o rest/rest.cpp 


aes.o: random.o
    g++ -std=c++14 -D DEBUG -Wfatal-errors -c -lcrypto -o aes/aes.o random.o aes/aes.cpp

random.o:
    g++ -std=c++14 -Wfatal-errors -c -o random.o random.cpp

如果我将它编译为动态链接,我没有问题。但是,当我尝试静态编译时,会出现大量错误,例如:

aes.cpp:(.text+0x706): undefined reference to `EVP_DecryptInit_ex'
aes.cpp:(.text+0x732): undefined reference to `EVP_DecryptUpdate'
aes.cpp:(.text+0x763): undefined reference to `EVP_CIPHER_CTX_ctrl'
aes.cpp:(.text+0x792): undefined reference to `EVP_DecryptFinal_ex'
aes.cpp:(.text+0x7a1): undefined reference to `EVP_CIPHER_CTX_free'

基本上没有找到任何符号。我不确定我现在需要做什么。我尝试将我的目标文件构建为静态文件,但失败了。我研究了链接顺序,但这似乎是正确的。

我的问题归结为两件事:

  1. 静态链接其他对象时,这些对象是否也需要静态编译+归档?

  2. 我的设置有什么问题?

【问题讨论】:

  • 生成目标文件时传递两个输入文件的目的是什么(就像你为aes.o做的那样)?
  • 至于你的问题,缺少的功能应该在哪里?您是否缺少对象或源文件?您是否可能缺少与图书馆的链接?
  • 我以模块化方式构建我的应用程序。我可以对我从 SO 问题中省略的 random.o 等单独的模块进行单元测试。围绕 .o 文件构建我的所有单元测试,然后我将这些文件链接在一起以构建应用程序。如果我想把这些文件变成单独的 lib 文件,那很容易。
  • 所有缺少的函数都已经在系统上安装的 .so 库中。我已经仔细检查了,我的库也有 .a 组件,因此它应该能够检索我的符号... libssl.a 和 libcrypto.a 在系统的 lib 路径中。
  • 为什么投反对票。除非您对问题提供明显的答案或对如何改进提出批评,否则不应允许您投反对票。

标签: c++ c gcc g++


【解决方案1】:

您的rest.o 规则不需要REST_LIBS,因为它只编译源文件。您需要在 main 规则中将这些库传递给 g++ - 作为其中的一部分,g++ 将调用链接器。

【讨论】:

  • 谢谢 我一直不确定我的 make 文件中的那部分
【解决方案2】:

好吧,显然链接发生的顺序与我想象的相反......而且我认为我最初可能没有链接任何一个作为一个fufu错误。

REST_LIBS = -lboost_filesystem -lboost_system -lcpprest -lssl -lcrypto -ldl
# /usr/local/lib/libyaml-cpp.a

all: main

main: static_pack
    g++ -std=c++14 -D DEBUG -Wfatal-errors -I$(basepath)/vendors/cpp-jwt/include -I$(basepath)/vendors/json/include \
    -DTS=\"/ctts.json\" \
    -DCS_PATH=\"/bin\" \
    -DCTFS_ENC=\"/ctfs.enc\" \
    -DUNTAR_PATH=\"/\" \
    -DCLUSTER_PATH=\"/.clusters\" \
     -o run main.cpp \
    libmain.a $(REST_LIBS) -pthread  && \
    rm -rf debpkg/cs/usr/bin/cs debpkg/cs.deb && \
    cp run debpkg/cs/usr/bin/cs && \
    dpkg-deb -b debpkg/cs && \
    mv debpkg/cs.deb .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2019-03-31
    • 2017-11-05
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多