Skip to content

Commit b397248

Browse files
committed
Merge pull request #4094
202c95c devtools: have symbol check script check for exported symbols (Wladimir J. van der Laan) 92e3022 gitian: don't export any symbols from executable (Wladimir J. van der Laan) 3ab1664 gitian: build against Qt 4.6 (Wladimir J. van der Laan)
2 parents 18da578 + 202c95c commit b397248

File tree

4 files changed

+293
-2
lines changed

4 files changed

+293
-2
lines changed

contrib/devtools/symbol-check.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,15 @@ def check_version(max_versions, version):
9898
cppfilt = CPPFilt()
9999
retval = 0
100100
for filename in sys.argv[1:]:
101+
# Check imported symbols
101102
for sym,version in read_symbols(filename, True):
102103
if version and not check_version(MAX_VERSIONS, version):
103104
print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version))
104105
retval = 1
106+
# Check exported symbols
107+
for sym,version in read_symbols(filename, False):
108+
print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym)))
109+
retval = 1
105110

106111
exit(retval)
107112

contrib/gitian-descriptors/gitian-linux.yml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ architectures:
77
- "amd64"
88
packages:
99
- "g++"
10-
- "libqt4-dev"
1110
- "git-core"
1211
- "unzip"
1312
- "pkg-config"
@@ -16,6 +15,11 @@ packages:
1615
- "automake"
1716
- "faketime"
1817
- "bsdmainutils"
18+
- "libqt4-core"
19+
- "libqt4-gui"
20+
- "libqt4-dbus"
21+
- "libqt4-network"
22+
- "libqt4-test"
1923
reference_datetime: "2013-06-01 00:00:00"
2024
remotes:
2125
- "url": "https://github.com/bitcoin/bitcoin.git"
@@ -25,23 +29,37 @@ files:
2529
- "bitcoin-deps-linux64-gitian-r5.zip"
2630
- "boost-linux32-1.55.0-gitian-r1.zip"
2731
- "boost-linux64-1.55.0-gitian-r1.zip"
32+
- "qt-linux32-4.6.4-gitian-r1.tar.gz"
33+
- "qt-linux64-4.6.4-gitian-r1.tar.gz"
2834
script: |
2935
STAGING="$HOME/install"
3036
OPTFLAGS='-O2'
3137
BINDIR="${OUTDIR}/bin/${GBUILD_BITS}" # 32/64 bit build specific output directory
3238
TEMPDIR="$HOME/tempdir"
3339
export TZ=UTC
3440
export LIBRARY_PATH="$STAGING/lib"
41+
export PATH="$STAGING/bin:$PATH"
3542
mkdir -p ${BINDIR}
3643
#
3744
mkdir -p $STAGING
3845
cd $STAGING
3946
unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r5.zip
4047
unzip ../build/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip
48+
tar -zxf ../build/qt-linux${GBUILD_BITS}-4.6.4-gitian-r1.tar.gz
4149
cd ../build
4250
51+
# Avoid exporting *any* symbols from the executable
52+
# This avoids conflicts between the libraries statically linked into bitcoin and any
53+
# libraries we may link dynamically (such as Qt and OpenSSL, see issue #4094).
54+
# It also avoids start-up overhead to not export any unnecessary symbols.
55+
# To do this, build a linker script that marks all symbols as local.
56+
LINKER_SCRIPT=$HOME/build/linker_version_script
57+
echo '
58+
{
59+
local: *;
60+
};' > $LINKER_SCRIPT
4361
function do_configure {
44-
./configure "$@" --enable-upnp-default --prefix=$STAGING --with-protoc-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" BOOST_CHRONO_EXTRALIBS="-lrt" --enable-glibc-back-compat
62+
./configure "$@" --enable-upnp-default --prefix=$STAGING --with-protoc-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib -Wl,--version-script=$LINKER_SCRIPT ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" BOOST_CHRONO_EXTRALIBS="-lrt" --enable-glibc-back-compat
4563
}
4664
#
4765
cd bitcoin
Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
---
2+
name: "qt-linux"
3+
suites:
4+
- "precise"
5+
architectures:
6+
- "i386"
7+
- "amd64"
8+
packages:
9+
- "zip"
10+
- "unzip"
11+
- "faketime"
12+
- "unzip"
13+
- "libxext-dev"
14+
reference_datetime: "2011-01-30 00:00:00"
15+
remotes: []
16+
files:
17+
- "qt-everywhere-opensource-src-4.6.4.tar.gz"
18+
script: |
19+
export FAKETIME=$REFERENCE_DATETIME
20+
export TZ=UTC
21+
if [ "$GBUILD_BITS" == "32" ]; then
22+
ARCH='i386-linux-gnu'
23+
else
24+
ARCH='x86_64-linux-gnu'
25+
fi
26+
# The purpose of this gitian build is not to actually build Qt, but to export
27+
# the headers as well as pkgconfig files in a useable format so that we can
28+
# pretend to link against an older version. The goal is to link to the
29+
# system version of Qt 4.
30+
# Also build development tools.
31+
INSTALLPREFIX="$HOME/install"
32+
# Integrity Check
33+
echo "9ad4d46c721b53a429ed5a2eecfd3c239a9ab566562f183f99d3125f1a234250 qt-everywhere-opensource-src-4.6.4.tar.gz" | sha256sum -c
34+
# Make install directories
35+
mkdir -p $INSTALLPREFIX
36+
mkdir -p $INSTALLPREFIX/include
37+
PKGCONFIGDIR=$INSTALLPREFIX/lib/pkgconfig
38+
mkdir -p $PKGCONFIGDIR
39+
#
40+
tar xzf qt-everywhere-opensource-src-4.6.4.tar.gz
41+
cd qt-everywhere-opensource-src-4.6.4
42+
QTBUILDDIR=$(pwd)
43+
44+
# Need to build 4.6-versioned host utilities as well (lrelease/qrc/lupdate/...)
45+
./configure -prefix $INSTALLPREFIX -confirm-license -release -opensource -no-qt3support -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-declarative -no-script -no-scripttools -no-javascript-jit -no-webkit -no-svg -no-xmlpatterns -no-sql-sqlite -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-libtiff -no-opengl -nomake examples -nomake demos -nomake docs
46+
#
47+
make $MAKEOPTS -C src/tools install # (rcc, uic, moc)
48+
make $MAKEOPTS -C tools/linguist/lrelease install # (lrelease)
49+
# install includes and pkgconfig files
50+
for DIR in src/corelib src/gui src/testlib src/dbus src/network; do
51+
(
52+
cd $DIR
53+
# extract module (QtCore/QtNetwork/...) from Makefile
54+
MODULE=$(grep "QMAKE_TARGET *=" Makefile | cut -d = -f 2 | xargs)
55+
# patch makefile so that not everything is build first
56+
sed -i 's/first: all/first:/g' Makefile
57+
make install_flat_headers install_class_headers install_targ_headers
58+
# create and install pkgconfig descriptor
59+
make ../../lib/pkgconfig/$MODULE.pc
60+
sed -e "s,$QTBUILDDIR,$INSTALLPREFIX,g" ../../lib/pkgconfig/$MODULE.pc > $PKGCONFIGDIR/$MODULE.pc
61+
# create links to existing Qt libraries
62+
ln -sf /usr/lib/${ARCH}/lib${MODULE}.so.4 ${INSTALLPREFIX}/lib/lib${MODULE}.so
63+
)
64+
done
65+
66+
# Write our own configuration header, same as Ubuntu
67+
# When we don't do this, the configuration will be without STL support (the QString from/to stdString methods)
68+
QCONFIG=$INSTALLPREFIX/include/Qt/qconfig.h
69+
echo '
70+
/* Qt Edition */
71+
#ifndef QT_EDITION
72+
# define QT_EDITION QT_EDITION_OPENSOURCE
73+
#endif
74+
' > $QCONFIG
75+
76+
if [ "$GBUILD_BITS" == "32" ]; then
77+
echo '
78+
/* Machine byte-order */
79+
#define Q_BIG_ENDIAN 4321
80+
#define Q_LITTLE_ENDIAN 1234
81+
#define QT_BUILD_KEY "i386 linux g++-4 full-config"
82+
#define QT_BUILD_KEY_COMPAT "i686 Linux g++-4 full-config"
83+
84+
#ifdef QT_BOOTSTRAPPED
85+
#define Q_BYTE_ORDER Q_LITTLE_ENDIAN
86+
#else
87+
#define Q_BYTE_ORDER Q_LITTLE_ENDIAN
88+
#endif
89+
/* Machine Architecture */
90+
#ifndef QT_BOOTSTRAPPED
91+
# define QT_ARCH_I386
92+
#else
93+
# define QT_ARCH_I386
94+
#endif
95+
/* Compile time features */
96+
#define QT_LARGEFILE_SUPPORT 64
97+
#define QT_POINTER_SIZE 4
98+
' >> $QCONFIG
99+
else
100+
echo '
101+
/* Machine byte-order */
102+
#define Q_BIG_ENDIAN 4321
103+
#define Q_LITTLE_ENDIAN 1234
104+
#define QT_BUILD_KEY "x86_64 linux g++-4 full-config"
105+
#define QT_BUILD_KEY_COMPAT "x86_64 Linux g++-4 full-config"
106+
107+
#ifdef QT_BOOTSTRAPPED
108+
#define Q_BYTE_ORDER Q_LITTLE_ENDIAN
109+
#else
110+
#define Q_BYTE_ORDER Q_LITTLE_ENDIAN
111+
#endif
112+
/* Machine Architecture */
113+
#ifndef QT_BOOTSTRAPPED
114+
# define QT_ARCH_X86_64
115+
#else
116+
# define QT_ARCH_X86_64
117+
#endif
118+
/* Compile time features */
119+
#define QT_LARGEFILE_SUPPORT 64
120+
#define QT_POINTER_SIZE 8
121+
' >> $QCONFIG
122+
fi
123+
124+
echo '
125+
#ifndef QT_BOOTSTRAPPED
126+
127+
#if defined(QT_NO_EGL) && defined(QT_EGL)
128+
# undef QT_NO_EGL
129+
#elif !defined(QT_NO_EGL) && !defined(QT_EGL)
130+
# define QT_NO_EGL
131+
#endif
132+
133+
#if defined(QT_NO_GSTREAMER) && defined(QT_GSTREAMER)
134+
# undef QT_NO_GSTREAMER
135+
#elif !defined(QT_NO_GSTREAMER) && !defined(QT_GSTREAMER)
136+
# define QT_NO_GSTREAMER
137+
#endif
138+
139+
#if defined(QT_NO_ICD) && defined(QT_ICD)
140+
# undef QT_NO_ICD
141+
#elif !defined(QT_NO_ICD) && !defined(QT_ICD)
142+
# define QT_NO_ICD
143+
#endif
144+
145+
#if defined(QT_NO_IMAGEFORMAT_JPEG) && defined(QT_IMAGEFORMAT_JPEG)
146+
# undef QT_NO_IMAGEFORMAT_JPEG
147+
#elif !defined(QT_NO_IMAGEFORMAT_JPEG) && !defined(QT_IMAGEFORMAT_JPEG)
148+
# define QT_NO_IMAGEFORMAT_JPEG
149+
#endif
150+
151+
#if defined(QT_NO_IMAGEFORMAT_MNG) && defined(QT_IMAGEFORMAT_MNG)
152+
# undef QT_NO_IMAGEFORMAT_MNG
153+
#elif !defined(QT_NO_IMAGEFORMAT_MNG) && !defined(QT_IMAGEFORMAT_MNG)
154+
# define QT_NO_IMAGEFORMAT_MNG
155+
#endif
156+
157+
#if defined(QT_NO_IMAGEFORMAT_TIFF) && defined(QT_IMAGEFORMAT_TIFF)
158+
# undef QT_NO_IMAGEFORMAT_TIFF
159+
#elif !defined(QT_NO_IMAGEFORMAT_TIFF) && !defined(QT_IMAGEFORMAT_TIFF)
160+
# define QT_NO_IMAGEFORMAT_TIFF
161+
#endif
162+
163+
#if defined(QT_NO_MULTIMEDIA) && defined(QT_MULTIMEDIA)
164+
# undef QT_NO_MULTIMEDIA
165+
#elif !defined(QT_NO_MULTIMEDIA) && !defined(QT_MULTIMEDIA)
166+
# define QT_NO_MULTIMEDIA
167+
#endif
168+
169+
#if defined(QT_NO_OPENVG) && defined(QT_OPENVG)
170+
# undef QT_NO_OPENVG
171+
#elif !defined(QT_NO_OPENVG) && !defined(QT_OPENVG)
172+
# define QT_NO_OPENVG
173+
#endif
174+
175+
#if defined(QT_NO_PHONON) && defined(QT_PHONON)
176+
# undef QT_NO_PHONON
177+
#elif !defined(QT_NO_PHONON) && !defined(QT_PHONON)
178+
# define QT_NO_PHONON
179+
#endif
180+
181+
#if defined(QT_NO_PULSEAUDIO) && defined(QT_PULSEAUDIO)
182+
# undef QT_NO_PULSEAUDIO
183+
#elif !defined(QT_NO_PULSEAUDIO) && !defined(QT_PULSEAUDIO)
184+
# define QT_NO_PULSEAUDIO
185+
#endif
186+
187+
#if defined(QT_NO_S60) && defined(QT_S60)
188+
# undef QT_NO_S60
189+
#elif !defined(QT_NO_S60) && !defined(QT_S60)
190+
# define QT_NO_S60
191+
#endif
192+
193+
#if defined(QT_NO_STYLE_S60) && defined(QT_STYLE_S60)
194+
# undef QT_NO_STYLE_S60
195+
#elif !defined(QT_NO_STYLE_S60) && !defined(QT_STYLE_S60)
196+
# define QT_NO_STYLE_S60
197+
#endif
198+
199+
#if defined(QT_NO_SXE) && defined(QT_SXE)
200+
# undef QT_NO_SXE
201+
#elif !defined(QT_NO_SXE) && !defined(QT_SXE)
202+
# define QT_NO_SXE
203+
#endif
204+
205+
#if defined(QT_NO_WEBKIT) && defined(QT_WEBKIT)
206+
# undef QT_NO_WEBKIT
207+
#elif !defined(QT_NO_WEBKIT) && !defined(QT_WEBKIT)
208+
# define QT_NO_WEBKIT
209+
#endif
210+
211+
#if defined(QT_NO_ZLIB) && defined(QT_ZLIB)
212+
# undef QT_NO_ZLIB
213+
#elif !defined(QT_NO_ZLIB) && !defined(QT_ZLIB)
214+
# define QT_NO_ZLIB
215+
#endif
216+
217+
#if defined(QT_RUNTIME_XCURSOR) && defined(QT_NO_RUNTIME_XCURSOR)
218+
# undef QT_RUNTIME_XCURSOR
219+
#elif !defined(QT_RUNTIME_XCURSOR) && !defined(QT_NO_RUNTIME_XCURSOR)
220+
# define QT_RUNTIME_XCURSOR
221+
#endif
222+
223+
#if defined(QT_RUNTIME_XFIXES) && defined(QT_NO_RUNTIME_XFIXES)
224+
# undef QT_RUNTIME_XFIXES
225+
#elif !defined(QT_RUNTIME_XFIXES) && !defined(QT_NO_RUNTIME_XFIXES)
226+
# define QT_RUNTIME_XFIXES
227+
#endif
228+
229+
#if defined(QT_RUNTIME_XINERAMA) && defined(QT_NO_RUNTIME_XINERAMA)
230+
# undef QT_RUNTIME_XINERAMA
231+
#elif !defined(QT_RUNTIME_XINERAMA) && !defined(QT_NO_RUNTIME_XINERAMA)
232+
# define QT_RUNTIME_XINERAMA
233+
#endif
234+
235+
#if defined(QT_RUNTIME_XINPUT) && defined(QT_NO_RUNTIME_XINPUT)
236+
# undef QT_RUNTIME_XINPUT
237+
#elif !defined(QT_RUNTIME_XINPUT) && !defined(QT_NO_RUNTIME_XINPUT)
238+
# define QT_RUNTIME_XINPUT
239+
#endif
240+
241+
#if defined(QT_RUNTIME_XRANDR) && defined(QT_NO_RUNTIME_XRANDR)
242+
# undef QT_RUNTIME_XRANDR
243+
#elif !defined(QT_RUNTIME_XRANDR) && !defined(QT_NO_RUNTIME_XRANDR)
244+
# define QT_RUNTIME_XRANDR
245+
#endif
246+
247+
#if defined(QT_USE_MATH_H_FLOATS) && defined(QT_NO_USE_MATH_H_FLOATS)
248+
# undef QT_USE_MATH_H_FLOATS
249+
#elif !defined(QT_USE_MATH_H_FLOATS) && !defined(QT_NO_USE_MATH_H_FLOATS)
250+
# define QT_USE_MATH_H_FLOATS
251+
#endif
252+
253+
#endif // QT_BOOTSTRAPPED
254+
255+
#define QT_VISIBILITY_AVAILABLE
256+
' >> $QCONFIG
257+
cp $QCONFIG $INSTALLPREFIX/include/QtCore/qconfig.h
258+
259+
cd $INSTALLPREFIX
260+
# as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date
261+
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
262+
# Create a .tar.gz because .zip has problems with symbolic links
263+
find | sort | tar --no-recursion -cT /dev/stdin --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 --mtime="$REFERENCE_DATETIME" | gzip -n > $OUTDIR/qt-linux${GBUILD_BITS}-4.6.4-gitian-r1.tar.gz

doc/release-process.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ Release Process
4747
wget 'https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch' -O \
4848
boost-mingw-gas-cross-compile-2013-03-03.patch
4949
wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz'
50+
wget 'https://download.qt-project.org/archive/qt/4.6/qt-everywhere-opensource-src-4.6.4.tar.gz'
5051
wget 'https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2'
5152
cd ..
5253
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-linux.yml
5354
mv build/out/boost-*.zip inputs/
5455
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-linux.yml
5556
mv build/out/bitcoin-deps-*.zip inputs/
57+
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-linux.yml
58+
mv build/out/qt-*.tar.gz inputs/
5659
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win.yml
5760
mv build/out/boost-*.zip inputs/
5861
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win.yml
@@ -68,6 +71,8 @@ Release Process
6871
571789867d172500fa96d63d0ba8c5b1e1a3d6f44f720eddf2f93665affc88b3 bitcoin-deps-linux64-gitian-r5.zip
6972
f29b7d9577417333fb56e023c2977f5726a7c297f320b175a4108cf7cd4c2d29 boost-linux32-1.55.0-gitian-r1.zip
7073
88232451c4104f7eb16e469ac6474fd1231bd485687253f7b2bdf46c0781d535 boost-linux64-1.55.0-gitian-r1.zip
74+
74ec2d301cf1a9d03b194153f545102ba45dad02b390485212fe6717de486361 qt-linux32-4.6.4-gitian-r1.tar.gz
75+
01d0477e299467f09280f15424781154e2b1ea4072c5edb16e044c234954fd9a qt-linux64-4.6.4-gitian-r1.tar.gz
7176
60dc2d3b61e9c7d5dbe2f90d5955772ad748a47918ff2d8b74e8db9b1b91c909 boost-win32-1.55.0-gitian-r6.zip
7277
f65fcaf346bc7b73bc8db3a8614f4f6bee2f61fcbe495e9881133a7c2612a167 boost-win64-1.55.0-gitian-r6.zip
7378
97e62002d338885336bb24e7cbb9471491294bd8857af7a83d18c0961f864ec0 bitcoin-deps-win32-gitian-r11.zip

0 commit comments

Comments
 (0)