3 # This file is part of the LibreOffice project.
5 # This Source Code Form is subject to the terms of the Mozilla Public
6 # License, v. 2.0. If a copy of the MPL was not distributed with this
7 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 # verify that ELF NEEDED entries are known-good so hopefully builds run on
11 # lots of different GNU/Linux distributions
16 check_path
="${INSTDIR:-.}"
21 -d <dir
> directory to check
22 -p run unbound parallel checks
25 [ -z "${1:-}" ] && exit 0
36 while [ "${1:-}" != "" ]; do
40 if [ "${1}" != "${parm?}" ] ; then
48 if [ "$has_arg" ] ; then
54 if [ ! -d "$check_path" ]; then
55 die
"Invalid directory '$check_path'"
62 # this sounds counter intuitive but the idea
63 # is to possibly support -p <n>
64 # in the meantime: 0 = nolimit and -p 1 would mean
65 # the current default: serialize
69 die
"Invalid option $1"
72 if [ "$DO_NEW" = 1 ] ; then
75 die
"Invalid argument $1"
83 files
=$
(find "${check_path}/program" "${check_path}/sdk/bin" -type f
)
84 # all RPATHs should point to ${INSTDIR}/program so that's the files they find
85 programfiles
=$
(echo ${files} |
grep -o '/program/[^/]* ' |
xargs -n 1 basename)
87 # allowlists should contain only system libraries that have a good reputation
88 # of maintaining ABI stability
89 # allow extending the allowlist using the environment variable to be able to work
90 # on the installer stuff without the need for a baseline setup
91 globalallowlist
="ld-linux-x86-64.so.2 ld-linux.so.2 libc.so.6 libm.so.6 libdl.so.2 libpthread.so.0 librt.so.1 libutil.so.1 libnsl.so.1 libcrypt.so.1 libgcc_s.so.1 libstdc++.so.6 libz.so.1 libfontconfig.so.1 libfreetype.so.6 libxml2.so.2 libxslt.so.1 libexslt.so.0 libnspr4.so libnss3.so libnssutil3.so libplc4.so libplds4.so libsmime3.so libssl3.so ${LO_ELFCHECK_ALLOWLIST-}"
92 x11allowlist
="libX11.so.6 libX11-xcb.so.1 libXext.so.6 libSM.so.6 libICE.so.6 libXinerama.so.1 libXrender.so.1 libXrandr.so.2 libcairo.so.2"
93 openglallowlist
="libGL.so.1"
94 gobjectallowlist
="libgobject-2.0.so.0 libglib-2.0.so.0"
95 gdbusallowlist
="libdbus-glib-1.so.2 libdbus-1.so.3 libgmodule-2.0.so.0 libgthread-2.0.so.0 ${gobjectallowlist}"
96 gioallowlist
="libgio-2.0.so.0 ${gdbusallowlist}"
97 gstreamerallowlist
="libgsttag-1.0.so.0 libgstaudio-1.0.so.0 libgstpbutils-1.0.so.0 libgstvideo-1.0.so.0 libgstbase-1.0.so.0 libgstreamer-1.0.so.0 ${gobjectallowlist}"
98 gtk3allowlist
="libgtk-3.so.0 libgdk-3.so.0 libcairo-gobject.so.2 libpangocairo-1.0.so.0 libfribidi.so.0 libatk-1.0.so.0 libcairo.so.2 libpangoft2-1.0.so.0 libpango-1.0.so.0 libfontconfig.so.1 libfreetype.so.6 libgdk_pixbuf-2.0.so.0 libharfbuzz.so.0 ${gioallowlist}"
99 gtk4allowlist
="libgtk-4.so.1 libcairo-gobject.so.2 libpangocairo-1.0.so.0 libatk-1.0.so.0 libcairo.so.2 libpango-1.0.so.0 libgdk_pixbuf-2.0.so.0 libharfbuzz.so.0 libgraphene-1.0.so.0 ${gioallowlist}"
100 qt5allowlist
="libQt5Core.so.5 libQt5Gui.so.5 libQt5Network.so.5 libQt5Widgets.so.5 libQt5X11Extras.so.5 libcairo.so.2 libxcb.so.1 libxcb-icccm.so.4 ${gobjectallowlist}"
101 kf5allowlist
="libKF5ConfigCore.so.5 libKF5CoreAddons.so.5 libKF5I18n.so.5 libKF5KIOCore.so.5 libKF5KIOFileWidgets.so.5 libKF5KIOWidgets.so.5 libKF5WindowSystem.so.5"
102 avahiallowlist
="libavahi-common.so.3 libavahi-client.so.3 ${gdbusallowlist}"
103 kerberosallowlist
="libgssapi_krb5.so.2 libcom_err.so.2 libkrb5.so.3"
104 dconfallowlist
="libdconf.so.1 libgio-2.0.so.0 ${gobjectallowlist}"
111 allowlist
="${globalallowlist}"
114 # skip the majority of files, no ELF binaries here
117 */_uuid.cpython-
*.so
)
118 allowlist
="${allowlist} libuuid.so.1"
121 allowlist
="${allowlist} ${x11allowlist} libxcb-shm.so.0 libxcb.so.1 libxcb-render.so.0"
123 */libcairocanvaslo.so
)
124 allowlist
="${allowlist} libcairo.so.2"
126 */libucpgio1lo.so|
*/liblosessioninstalllo.so|
*/libevoablo.so
)
127 allowlist
="${allowlist} ${gioallowlist}"
130 allowlist
="${allowlist} ${gstreamerallowlist}"
133 allowlist
="${allowlist} ${gtk4allowlist}"
135 */libvclplug_kf5lo.so|
*/libkf5be1lo.so
)
136 if [ "$ENABLE_KF5" = TRUE
]; then
137 allowlist
="${allowlist} ${qt5allowlist} ${kf5allowlist}"
140 */libvclplug_gtk3lo.so|
*/updater
)
141 allowlist
="${allowlist} ${x11allowlist} ${gtk3allowlist}"
143 */libvclplug_gtk4lo.so
)
144 allowlist
="${allowlist} ${x11allowlist} ${gtk4allowlist}"
146 */libvclplug_qt5lo.so
)
147 if [ "$ENABLE_QT5" = TRUE
]; then
148 allowlist
="${allowlist} ${qt5allowlist}"
151 */libvclplug_gtk3_kde5lo.so
)
152 if [ "$ENABLE_GTK3_KDE5" = TRUE
]; then
153 allowlist
="${allowlist} ${x11allowlist} ${gtk3allowlist} ${qt5allowlist} ${kf5allowlist}"
157 if [ "$ENABLE_GTK3_KDE5" = TRUE
]; then
158 allowlist
="${allowlist} ${x11allowlist} ${gtk3allowlist} ${qt5allowlist} \
162 */libdesktop_detectorlo.so|
*/oosplash|
*/gengal.bin
)
163 allowlist
="${allowlist} ${x11allowlist}"
165 */libvclplug_genlo.so|
*/libchartcorelo.so|
*/libavmediaogl.so|
*/libOGLTranslo.so|
*/liboglcanvaslo.so
)
166 allowlist
="${allowlist} ${x11allowlist} ${openglallowlist}"
169 allowlist
="${allowlist} ${x11allowlist} ${openglallowlist} ${gioallowlist} libcups.so.2"
172 allowlist
="${allowlist} ${x11allowlist} ${openglallowlist} ${gioallowlist} libcups.so.2"
174 */liblibreofficekitgtk.so
)
175 allowlist
="${allowlist} ${gtk3allowlist}"
178 allowlist
="${allowlist} ${avahiallowlist}"
181 allowlist
="${allowlist} ${openglallowlist} ${x11allowlist}"
184 allowlist
="${allowlist} libjawt.so"
186 */libpostgresql-sdbc-impllo.so
)
187 allowlist
="${allowlist} ${kerberosallowlist}"
190 if [ "$ENABLE_DCONF" = TRUE
]; then
191 allowlist
="${allowlist} ${dconfallowlist}"
195 allowlist
="${allowlist} ${x11allowlist} ${openglallowlist} ${gioallowlist} ${dconfallowlist} libcups.so.2 libcairo.so.2"
198 if test "${skip}" = 0 && readelf
-d "${file}" &> /dev
/null
; then
199 rpath
=$
(readelf
-d "${file}" |
grep '(\(RPATH\|RUNPATH\))' || true
)
200 neededs
=$
(readelf
-d "${file}" |
grep '(NEEDED)' |
sed -e 's/.*\[\(.*\)\]$/\1/')
202 for needed
in ${neededs}
204 if ! echo ${allowlist} |
grep -q -w "${needed}" ; then
205 neededsinternal
="${neededsinternal} ${needed}"
206 if ! echo ${programfiles} |
grep -q -w "${needed}" ; then
207 echo "${file}" has suspicious NEEDED
: "${needed}"
212 if test -z "${rpath}" ; then
214 */python-core-
*/lib
/lib-dynload
/*)
215 # python modules don't have RPATH
217 */share
/extensions
/*)
218 # extension libraries don't have RPATH
221 # no NEEDED from instdir, no RPATH needed
222 if test -n "${neededsinternal}" ; then
223 echo "${file}" has no RPATH
231 if echo "${rpath}" |
grep -q -v '\[\$ORIGIN/../../program\]$' ; then
232 echo "${file}" has unexpected RPATH
"${rpath}"
237 if echo "${rpath}" |
grep -q -v '\[\$ORIGIN\]$' ; then
238 echo "${file}" has unexpected RPATH
"${rpath}"
248 if [ "$PARA" = "1" ] ; then
264 if [ -s check_elf.out
] ; then