Bitcoin Forum
September 29, 2022, 05:33:12 PM *
News: Latest Bitcoin Core release: 23.0 [Torrent]
   Home   Help Search Login Register More  
Pages: [1]
Author Topic: Help please!! Building static versions on Linux  (Read 3634 times)
FuzzyBear (OP)
Offline Offline

Activity: 1414
Merit: 1007

View Profile WWW
October 20, 2013, 09:00:16 AM
Last edit: October 20, 2013, 05:40:20 PM by FuzzyBear


I could do with a little help understanding the final stage for me in a great learning experiment regarding bitcoin and altcoins I have been doing in my spare time.  

Before bitcoin I had never used Linux, was a windows user through and through but have switched over and taught myself a lot and enjoyed the whole learning experience.  So please be gentle with me for failing to be able to complete this task on my own.

Trying to build a binary for myself on linux (ubuntu) that will work on other linux installs without having to install the dependencies

I have installed the dependencies on ubuntu. Now when I build I need to pass the Static flag in correct? but I seem to not understand how to declare this correctly Sad

I am all for learning so please feel free to expand on things that are important areas to understand for me... or tell me where I am being a fool and making a meal out of something.  

Here is the sample makefile I have

# Copyright (c) 2009-2010 Satoshi Nakamoto
# Distributed under the MIT/X11 software license, see the accompanying
# file license.txt or




TESTDEFS = -DTEST_DATA_DIR=$(abspath test/data)

LMODE = dynamic
LMODE2 = dynamic
ifdef STATIC
LMODE = static
ifeq (${STATIC}, all)
LMODE2 = static

# for boost 1.37, add -mt to the boost libraries
LIBS += \
 -Wl,-B$(LMODE) \
   -l boost_system$(BOOST_LIB_SUFFIX) \
   -l boost_filesystem$(BOOST_LIB_SUFFIX) \
   -l boost_program_options$(BOOST_LIB_SUFFIX) \
   -l boost_thread$(BOOST_LIB_SUFFIX) \
   -l db_cxx$(BDB_LIB_SUFFIX) \
   -l ssl \
   -l crypto

ifndef USE_UPNP
override USE_UPNP = -
ifneq (${USE_UPNP}, -)
LIBS += -l miniupnpc

LIBS+= \
 -Wl,-B$(LMODE2) \
   -l z \
   -l dl \
   -l pthread

# Hardening
# Make some classes of vulnerabilities unexploitable in case one is discovered.
    # This is a workaround for Ubuntu bug #691722, the default -fstack-protector causes
    # -fstack-protector-all to be ignored unless -fno-stack-protector is used first.
    # see:

    # Stack Canaries
    # Put numbers at the beginning of each stack frame and check that they are the same.
    # If a stack buffer if overflowed, it writes over the canary number and then on return
    # when that number is checked, it won't be the same and the program will exit with
    # a "Stack smashing detected" error instead of being exploited.
    HARDENING+=-fstack-protector-all -Wstack-protector

    # Make some important things such as the global offset table read only as soon as
    # the dynamic linker is finished building it. This will prevent overwriting of addresses
    # which would later be jumped to.
    LDHARDENING+=-Wl,-z,relro -Wl,-z,now

    # Build position independent code to take advantage of Address Space Layout Randomization
    # offered by some kernels.
    # see doc/build-unix.txt for more information.
    ifdef PIE

    # -D_FORTIFY_SOURCE=2 does some checking for potentially exploitable code patterns in
    # the source such overflowing a statically defined buffer.


# CXXFLAGS can be specified on the make command line, so we use xCXXFLAGS that only
# adds some defaults in front. Unfortunately, CXXFLAGS=... $(CXXFLAGS) does not work.
xCXXFLAGS=-O2 -pthread -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter \

# LDFLAGS can be specified on the make command line, so we use xLDFLAGS that only
# adds some defaults in front. Unfortunately, LDFLAGS=... $(LDFLAGS) does not work.

    obj/version.o \
    obj/checkpoints.o \
    obj/netbase.o \
    obj/addrman.o \
    obj/crypter.o \
    obj/key.o \
    obj/db.o \
    obj/init.o \
    obj/irc.o \
    obj/keystore.o \
    obj/main.o \
    obj/net.o \
    obj/protocol.o \
    obj/bitcoinrpc.o \
    obj/rpcdump.o \
    obj/rpcnet.o \
    obj/rpcrawtransaction.o \
    obj/script.o \
    obj/scrypt.o \
    obj/sync.o \
    obj/util.o \
    obj/wallet.o \
    obj/walletdb.o \

all: Hrankd

# auto-generated dependencies:
-include obj/*.P
-include obj-test/*.P

obj/scrypt.o: scrypt.c
gcc -c -o $@ $^

obj/build.h: FORCE
/bin/sh ../share/ obj/build.h
version.cpp: obj/build.h

obj/%.o: %.cpp
$(CXX) -c $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $<
@cp $(@:%.o=%.d) $(@:%.o=%.P); \
 sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
     -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \
 rm -f $(@:%.o=%.d)

Hrankd: $(OBJS:obj/%=obj/%)
$(CXX) $(xCXXFLAGS) -o $@ $^ $(xLDFLAGS) $(LIBS)

TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp))

obj-test/%.o: test/%.cpp
$(CXX) -c $(TESTDEFS) $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $<
@cp $(@:%.o=%.d) $(@:%.o=%.P); \
 sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
     -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \
 rm -f $(@:%.o=%.d)

test_Hrankd: $(TESTOBJS) $(filter-out obj/init.o,$(OBJS:obj/%=obj/%))
$(CXX) $(xCXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-B$(LMODE) -lboost_unit_test_framework $(xLDFLAGS) $(LIBS)

-rm -f Hrankd test_Hrankd
-rm -f obj/*.o
-rm -f obj-test/*.o
-rm -f obj/*.P
-rm -f obj-test/*.P
-rm -f src/build.h

Now it all works when building a dynamic library ... however changing in the makefile
it errors.. I am investigating this error cannot find -lgcc_s

Rather than changing in the makefile as well the values for LMODE, can I not pass this in on my make -f makefile.unix command?

Many thanks for your help and for reading, if you want more info or code etc just ask sorry I am not as experienced as many others and I am completely self taught so there may be some alarming gaps in my knowledge.


***** Earn DEV at *****
Pages: [1]
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!