From: Raphaël Hertzog Date: Fri, 28 Sep 2018 13:09:34 +0000 (+0100) Subject: Import pyside2_5.11.2-1.debian.tar.xz X-Git-Tag: archive/raspbian/5.11.2-2+rpi1~1^2~4^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=55cd46d79cc4500e5b645c1f289ee90be9d26e07;p=pyside2.git Import pyside2_5.11.2-1.debian.tar.xz [dgit import tarball pyside2 5.11.2-1 pyside2_5.11.2-1.debian.tar.xz] --- 55cd46d79cc4500e5b645c1f289ee90be9d26e07 diff --git a/changelog b/changelog new file mode 100644 index 0000000..13f160b --- /dev/null +++ b/changelog @@ -0,0 +1,53 @@ +pyside2 (5.11.2-1) unstable; urgency=medium + + [ Raphaël Hertzog ] + * New upstream version 5.11.2 + * Remove patches merged upstream + * Merge fix-PAGESIZE.patch into update-patchelf.patch + * Add patchelf to Build-Depends + * Bump Standards-Version to 4.2.1 + + [ Frédéric Bonnard ] + * Fix hardcoded PAGESIZE for patchelf.cc. Closes: #909265 + + -- Raphaël Hertzog Fri, 28 Sep 2018 15:09:34 +0200 + +pyside2 (5.11.0-4) unstable; urgency=medium + + * Use default llvm-dev and libclang-dev (Closes: #906168) + * Add Cmake config files for Python3 (Closes: #906020) + * Fix debian/libpyside2-5.11.install for triplets that are not *-linux-gnu + (thanks to Adrian Bunk) + * Add an upstream patch to fix build on armel/armhf + + -- Sophie Brun Mon, 27 Aug 2018 12:53:29 +0200 + +pyside2 (5.11.0-3) unstable; urgency=medium + + * More fixes for builds building only arch any or only arch all. + * Really fix the build with dpkg-buildpackage -A. + + -- Raphaël Hertzog Tue, 31 Jul 2018 21:33:04 +0200 + +pyside2 (5.11.0-2) unstable; urgency=medium + + [ Raphaël Hertzog ] + * Fix build with dpkg-buildpackage -A. Closes: #904892 + * Fix python-pyside2 dependencies. Replace python-pyside2.widgets by + python-pyside2.qtwidgets. + + [ Sophie Brun ] + * Drop useless "Testsuite: autopkgtest-pkg-python". + * Enable parallel build. + * Limit QtWebEngine packages to amd64 arm64 armhf i386 mipsel. + * Remove unused lintian-overrides. + * Use python2 only in pyside2-tools. + * Remove big metapackages python-pyside2 and python3-pyside2. + + -- Raphaël Hertzog Tue, 31 Jul 2018 16:37:40 +0200 + +pyside2 (5.11.0-1) unstable; urgency=medium + + * Initial release (Closes: #877871) + + -- Sophie Brun Thu, 26 Jul 2018 17:47:45 +0200 diff --git a/compat b/compat new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +11 diff --git a/control b/control new file mode 100644 index 0000000..14657d5 --- /dev/null +++ b/control @@ -0,0 +1,984 @@ +Source: pyside2 +Section: python +Priority: optional +Maintainer: Debian Qt/KDE Maintainers +Uploaders: Sophie Brun , + Raphaël Hertzog +Build-Depends: chrpath, + cmake (>= 3.1), + debhelper (>= 11), + dh-exec, + dh-python, + libclang-dev, + libqt5charts5-dev, + libqt5opengl5-dev, + libqt5sensors5-dev, + libqt5svg5-dev, + libqt5texttospeech5-dev, + libqt5webchannel5-dev, + libqt5webkit5-dev, + libqt5websockets5-dev, + libqt5x11extras5-dev, + libqt5xmlpatterns5-dev, + libxml2-dev, + libxslt1-dev, + llvm-dev, + patchelf, + pyqt5-dev (>=5.6), + python-all-dev, + python-setuptools, + python-wheel, + python3-all-dev, + python3-setuptools, + python3-sphinx, + python3-sphinx-rtd-theme, + python3-wheel, + qt3d-assimpsceneimport-plugin, + qt3d-defaultgeometryloader-plugin, + qt3d-gltfsceneio-plugin, + qt3d-scene2d-plugin, + qt3d5-dev, + qt5-qmake, + qt5-qmake-bin, + qtbase5-dev, + qtbase5-private-dev, + qtchooser, + qtdeclarative5-dev, + qtdeclarative5-private-dev, + qtlocation5-dev, + qtmultimedia5-dev, + qtpositioning5-dev, + qtscript5-dev, + qttools5-dev, + qtwebengine5-dev [amd64 arm64 armhf i386 mipsel] +Standards-Version: 4.2.1 +Homepage: https://wiki.qt.io/Qt_for_Python +Vcs-Git: https://salsa.debian.org/qt-kde-team/qt/pyside2.git +Vcs-Browser: https://salsa.debian.org/qt-kde-team/qt/pyside2 + +Package: python-pyside2-doc +Architecture: all +Section: doc +Depends: ${misc:Depends}, ${sphinxdoc:Depends} +Description: Python bindings for Qt5 (common documentation) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains the common documentation package. + +Package: libpyside2-5.11 +Section: libs +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python 2 bindings for Qt5 (base files) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python2 base file used by all modules. + +Package: libpyside2-py3-5.11 +Section: libs +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python 3 bindings for Qt5 (base files) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python3 base file used by all modules. + +Package: libpyside2-dev +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, libpyside2-5.11 (= ${binary:Version}), + libpyside2-py3-5.11 (= ${binary:Version}), pyqt5-dev +Description: Python bindings for Qt5 (development files) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package provides the development headers for the libpyside2 library. + +Package: python-pyside2.qtcore +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Suggests: python-pyside2-doc +Description: Python bindings for Qt5 core module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtCore module. + +Package: python3-pyside2.qtcore +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Suggests: python-pyside2-doc +Description: Python bindings for Qt5 core module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtCore module. + +Package: shiboken2 +Section: devel +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends} +Description: CPython bindings generator for C++ libraries + Shiboken2 is a bindings generator for C++ libraries that outputs CPython + source code. It collects information from library headers, and then + merges modifications and handwritten code defined in the typesystem + description. + . + Shiboken2 is the binding generator used to create the PySide2 bindings. + +Package: libshiboken2-5.11 +Section: libs +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: CPython bindings generator for C++ libraries (Python2 shared library) + Shiboken2 is a bindings generator for C++ libraries that outputs CPython + source code. It collects information from library headers, and then + merges modifications and handwritten code defined in the typesystem + description. + . + Shiboken2 is the binding generator used to create the PySide2 bindings. + . + This package contains the shared Python 2 library used by shiboken2. + +Package: libshiboken2-py3-5.11 +Section: libs +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: CPython bindings generator for C++ libraries (Python3 shared library) + Shiboken2 is a bindings generator for C++ libraries that outputs CPython + source code. It collects information from library headers, and then + merges modifications and handwritten code defined in the typesystem + description. + . + Shiboken2 is the binding generator used to create the PySide2 bindings. + . + This package contains the shared Python 3 library used by shiboken2. + +Package: libshiboken2-dev +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, libshiboken2-5.11 (= ${binary:Version}), + libshiboken2-py3-5.11 (= ${binary:Version}), python-dev +Description: CPython bindings generator for C++ libraries (development files) + Shiboken2 is a bindings generator for C++ libraries that outputs CPython + source code. It collects information from library headers, and then + merges modifications and handwritten code defined in the typesystem + description. + . + Shiboken2 is the binding generator used to create the PySide2 bindings. + . + This package provides the development headers for the libshiboken2 library. + +Package: shiboken2-doc +Architecture: all +Section: doc +Depends: ${misc:Depends}, ${sphinxdoc:Depends} +Description: CPython bindings generator for C++ libraries (common documentation) + Shiboken2 is a bindings generator for C++ libraries that outputs CPython + source code. It collects information from library headers, and then + merges modifications and handwritten code defined in the typesystem + description. + . + Shiboken2 is the binding generator used to create the PySide2 bindings. + . + This package contains the common documentation. + +Package: pyside2-tools +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, python-pyside2uic, ${python:Depends} +Description: development tools for PySide2 (uic, rcc, lupdate) + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + PySide2 ships Python bindings for the Qt5 framework. This package ships + the following accompanying tools: + * pyside2-rcc - PySide resource compiler + * pyside2-uic - Python User Interface Compiler for PySide + * pyside2-lupdate - update Qt Linguist translation files for PySide + +Package: python-pyside2uic +Architecture: all +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: User Interface Compiler for PySide2 (Python 2) + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + PySide2 ships Python bindings for the Qt5 framework. + . + This package contains the Python User Interface Compiler for PySide2 in + Python 2. + +Package: python3-pyside2uic +Architecture: all +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: User Interface Compiler for PySide2 (Python 3) + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + PySide2 ships Python bindings for the Qt5 framework. + . + This package contains the Python User Interface Compiler for PySide2 in + Python 3. + +Package: python-pyside2.qtwidgets +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Widgets module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtWidgets module. + +Package: python3-pyside2.qtwidgets +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Widgets module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtWidgets module. + +Package: python-pyside2.qt3drender +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DRender module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the Qt3DRender module. + +Package: python3-pyside2.qt3drender +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DRender module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the Qt3DRender module. + +Package: python-pyside2.qtquick +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Quick module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtQuick module. + +Package: python3-pyside2.qtquick +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Quick module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtQuick module. + +Package: python-pyside2.qtpositioning +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Positioning module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtPositioning module. + +Package: python3-pyside2.qtpositioning +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Positioning module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtPositioning module. + +Package: python-pyside2.qtx11extras +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 X11Extras module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtX11Extras module. + +Package: python3-pyside2.qtx11extras +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 X11Extras module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtX11Extras module. + +Package: python-pyside2.qtqml +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Qml module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtQml module. + +Package: python3-pyside2.qtqml +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Qml module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtQml module. + +Package: python-pyside2.qtwebenginecore +Architecture: amd64 arm64 armhf i386 mipsel +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebEngineCore module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtWebEngineCore module. + +Package: python3-pyside2.qtwebenginecore +Architecture: amd64 arm64 armhf i386 mipsel +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebEngineCore module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtWebEngineCore module. + +Package: python-pyside2.qttexttospeech +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 TextToSpeech module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtTextToSpeech module. + +Package: python3-pyside2.qttexttospeech +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 TextToSpeech module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtTextToSpeech module. + +Package: python-pyside2.qthelp +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Help module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtHelp module. + +Package: python3-pyside2.qthelp +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Help module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtHelp module. + +Package: python-pyside2.qtscripttools +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 ScriptTools module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtScriptTools module. + +Package: python3-pyside2.qtscripttools +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 ScriptTools module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtScriptTools module. + +Package: python-pyside2.qtnetwork +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Network module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtNetwork module. + +Package: python3-pyside2.qtnetwork +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Network module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtNetwork module. + +Package: python-pyside2.qtmultimediawidgets +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 MultimediaWidgets module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtMultimediaWidgets module. + +Package: python3-pyside2.qtmultimediawidgets +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 MultimediaWidgets module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtMultimediaWidgets module. + +Package: python-pyside2.qtlocation +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Location module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtLocation module. + +Package: python3-pyside2.qtlocation +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Location module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtLocation module. + +Package: python-pyside2.qt3dlogic +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DLogic module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the Qt3DLogic module. + +Package: python3-pyside2.qt3dlogic +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DLogic module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the Qt3DLogic module. + +Package: python-pyside2.qtsensors +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Sensors module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtSensors module. + +Package: python3-pyside2.qtsensors +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Sensors module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtSensors module. + +Package: python-pyside2.qtmultimedia +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Multimedia module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtMultimedia module. + +Package: python3-pyside2.qtmultimedia +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Multimedia module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtMultimedia module. + +Package: python-pyside2.qtscript +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Script module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtScript module. + +Package: python3-pyside2.qtscript +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Script module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtScript module. + +Package: python-pyside2.qtwebchannel +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebChannel module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtWebChannel module. + +Package: python3-pyside2.qtwebchannel +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebChannel module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtWebChannel module. + +Package: python-pyside2.qtprintsupport +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 PrintSupport module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtPrintSupport module. + +Package: python3-pyside2.qtprintsupport +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 PrintSupport module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtPrintSupport module. + +Package: python-pyside2.qtquickwidgets +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 QuickWidgets module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtQuickWidgets module. + +Package: python3-pyside2.qtquickwidgets +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 QuickWidgets module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtQuickWidgets module. + +Package: python-pyside2.qt3dinput +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DInput module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the Qt3DInput module. + +Package: python3-pyside2.qt3dinput +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DInput module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the Qt3DInput module. + +Package: python-pyside2.qtxml +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Xml module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtXml module. + +Package: python3-pyside2.qtxml +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Xml module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtXml module. + +Package: python-pyside2.qttest +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Test module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtTest module. + +Package: python3-pyside2.qttest +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Test module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtTest module. + +Package: python-pyside2.qtwebenginewidgets +Architecture: amd64 arm64 armhf i386 mipsel +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebEngineWidgets module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtWebEngineWidgets module. + +Package: python3-pyside2.qtwebenginewidgets +Architecture: amd64 arm64 armhf i386 mipsel +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebEngineWidgets module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtWebEngineWidgets module. + +Package: python-pyside2.qtconcurrent +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Concurrent module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtConcurrent module. + +Package: python3-pyside2.qtconcurrent +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Concurrent module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtConcurrent module. + +Package: python-pyside2.qtxmlpatterns +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 XmlPatterns module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtXmlPatterns module. + +Package: python3-pyside2.qtxmlpatterns +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 XmlPatterns module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtXmlPatterns module. + +Package: python-pyside2.qtcharts +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Charts module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtCharts module. + +Package: python3-pyside2.qtcharts +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Charts module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtCharts module. + +Package: python-pyside2.qtuitools +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 UiTools module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtUiTools module. + +Package: python3-pyside2.qtuitools +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 UiTools module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtUiTools module. + +Package: python-pyside2.qtopengl +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 OpenGL module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtOpenGL module. + +Package: python3-pyside2.qtopengl +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 OpenGL module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtOpenGL module. + +Package: python-pyside2.qt3dcore +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DCore module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the Qt3DCore module. + +Package: python3-pyside2.qt3dcore +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 3DCore module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the Qt3DCore module. + +Package: python-pyside2.qtsql +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Sql module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtSql module. + +Package: python3-pyside2.qtsql +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Sql module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtSql module. + +Package: python-pyside2.qtgui +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Gui module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtGui module. + +Package: python3-pyside2.qtgui +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Gui module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtGui module. + +Package: python-pyside2.qtsvg +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Svg module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtSvg module. + +Package: python3-pyside2.qtsvg +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 Svg module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtSvg module. + +Package: python-pyside2.qtwebsockets +Architecture: any +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebSockets module (Python 2) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 2 bindings for the QtWebSockets module. + +Package: python3-pyside2.qtwebsockets +Architecture: any +Depends: ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends} +Description: Python bindings for Qt5 WebSockets module (Python 3) + pyside2 provides Python bindings for Qt 5.x framework. + . + Qt is a cross-platform C++ application framework. Qt's primary feature + is its rich set of widgets that provide standard GUI functionality. + . + This package contains Python 3 bindings for the QtWebSockets module. diff --git a/copyright b/copyright new file mode 100644 index 0000000..dfdd9cc --- /dev/null +++ b/copyright @@ -0,0 +1,261 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: pyside2 +Source: https://download.qt.io/official_releases/QtForPython/ + +Files: * +Copyright: 2016-2018 The Qt Company Ltd. +License: GPL-2 or GPL-3 or LGPL-3 + +Files: examples/* +Copyright: 2016-2018 The Qt Company Ltd. + 2011 Arun Srinivasan + 2010-2013 Riverbank Computing Limited. + 2010 Hans-Peter Jansen + 2010 velociraptor Genjix + 2009 Darryl Wallace, 2009 +License: BSD-3-clause + +Files: sources/patchelf/* +Copyright: 2004-2009 Eelco Dolstra +License: GPL-3+ + +Files: sources/patchelf/elf.h +Copyright: 1995-2008 Free Software Foundation, Inc. +License: LGPL-2.1+ + +Files: sources/pyside2/doc/typesystem_doc.xml.in + sources/pyside2/doc/codesnippets/* + sources/pyside2/doc/tutorials/* +Copyright: 2016 The Qt Company Ltd. +License: BSD-3-clause + +Files: sources/pyside2/doc/inheritance_diagram.py +Copyright: 2010-2011 by the PySide team + 2007-2011 by the Sphinx team +License: BSD-2-clause + All rights reserved. + . + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Files: sources/pyside2/doc/pyhtml2devhelp.py + sources/pyside2/tests/run_test.sh + sources/pyside2/tests/Qt* + sources/pyside2/tests/mac/qmacstyle_test.py + sources/pyside2/tests/manually/* + sources/pyside2/tests/pysidetest/* + sources/pyside2/tests/signals/* + sources/pyside2/tests/util/* + sources/shiboken2/ApiExtractor/* + sources/shiboken2/generator/* + sources/shiboken2/generatorrunnermacros.h + sources/shiboken2/generators/* + sources/shiboken2/tests/* + sources/pyside2/tests/QtQml/qquickitem_grabToImage.* +Copyright: 2009 Matthias Klose + 2002-2005 Roberto Raggi + 2011 Thomas Perl + 2013 Kitware, Inc. + 2016-2017 The Qt Company Ltd. +License: GPL-3-EXCEPT + +Files: sources/pyside2-tools/* +Copyright: 2016 The Qt Company Ltd. + 2010 Riverbank Computing Limited. + 2009-2011 Nokia Corporation and/or its subsidiary(-ies) + 2009 Torsten Marek + 2002-2007 Detlev Offenbach + 1992-2006 Trolltech AS. All rights reserved. +License: GPL-2 + +Files: debian/* +Copyright: 2018 Sophie Brun +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of The Qt Company Ltd nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + +License: GPL-2 + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2" + +License: GPL-3 + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3 as + published by the Free Software Foundation. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3" + +License: GPL-3+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3" + +License: GPL-3-EXCEPT + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3 as + published by the Free Software Foundation, annotated with The Qt Company + GPL Exception 1.0: + . + The Qt Company GPL Exception 1.0 + . + Exception 1: + . + As a special exception you may create a larger work which contains the + output of this application and distribute that work under terms of your + choice, so long as the work is not otherwise derived from or based on + this application and so long as the work does not in itself generate + output that contains the output from this application in its original + or modified form. + . + Exception 2: + . + As a special exception, you have permission to combine this application + with Plugins licensed under the terms of your choice, to produce an + executable, and to copy and distribute the resulting executable under + the terms of your choice. However, the executable must be accompanied + by a prominent notice offering all users of the executable the entire + source code to this application, excluding the source code of the + independent modules, but including any changes you have made to this + application, under the terms of this license. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3" + +License: LGPL-2.1+ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + . + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + . + On Debian systems, the complete text of the Lesser GNU General + Public License version 2.1 can be found in + "/usr/share/common-licenses/LGPL-2.1" + +License: LGPL-3 + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 3 as published by the Free Software Foundation. + . + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + . + On Debian systems, the complete text of the Lesser GNU General + Public License version 3 can be found in + "/usr/share/common-licenses/LGPL-3" diff --git a/libpyside2-5.11.install b/libpyside2-5.11.install new file mode 100755 index 0000000..e1efe83 --- /dev/null +++ b/libpyside2-5.11.install @@ -0,0 +1,5 @@ +#!/usr/bin/dh-exec +pyside2_install/py*-relwithdebinfo/lib/libpyside2-python2.7.${DEB_HOST_MULTIARCH}.so.* usr/lib/${DEB_HOST_MULTIARCH}/ +pyside2_install/py2*-relwithdebinfo/lib/python2.7/site-packages/PySide2/_git_pyside_version.py usr/lib/python2.7/dist-packages/PySide2 +pyside2_install/py2*-relwithdebinfo/lib/python2.7/site-packages/PySide2/__init__.py usr/lib/python2.7/dist-packages/PySide2 +pyside2_install/py2*-relwithdebinfo/lib/python2.7/site-packages/PySide2/_config.py usr/lib/python2.7/dist-packages/PySide2 diff --git a/libpyside2-5.11.lintian-overrides b/libpyside2-5.11.lintian-overrides new file mode 100644 index 0000000..5204a36 --- /dev/null +++ b/libpyside2-5.11.lintian-overrides @@ -0,0 +1,2 @@ +# We ship compiled versions for each supported python version, with a symlink to the default version +libpyside2-5.11: package-name-doesnt-match-sonames libpyside2-python2.7.x86-64-linux-gnu5.11 diff --git a/libpyside2-dev.install b/libpyside2-dev.install new file mode 100755 index 0000000..4632c59 --- /dev/null +++ b/libpyside2-dev.install @@ -0,0 +1,8 @@ +#!/usr/bin/dh-exec --with=subst +pyside2_install/py2*-relwithdebinfo/include/PySide2 usr/include +pyside2_install/py2*-relwithdebinfo/share/PySide2 usr/share +pyside2_install/py*-relwithdebinfo/lib/pkgconfig/pyside2.pc usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig +pyside2_install/py2*-relwithdebinfo/lib/libpyside2-python*.so usr/lib/${DEB_HOST_MULTIARCH} +pyside3_install/py3*-relwithdebinfo/lib/libpyside2*.so usr/lib/${DEB_HOST_MULTIARCH} +pyside2_install/py2*-relwithdebinfo/lib/cmake/PySide2* usr/lib/${DEB_HOST_MULTIARCH}/cmake +pyside3_install/py3*-relwithdebinfo/lib/cmake/PySide2*/PySide2Config.cpython* usr/lib/${DEB_HOST_MULTIARCH}/cmake/PySide2-${MAIN_VERSION_UPSTREAM} diff --git a/libpyside2-py3-5.11.install b/libpyside2-py3-5.11.install new file mode 100755 index 0000000..28f46be --- /dev/null +++ b/libpyside2-py3-5.11.install @@ -0,0 +1,5 @@ +#!/usr/bin/dh-exec +pyside3_install/py3*-relwithdebinfo/lib/libpyside2*.so.* usr/lib/${DEB_HOST_MULTIARCH} +pyside3_install/py3*-relwithdebinfo/lib/python*/site-packages/PySide2/_git_pyside_version.py usr/lib/python3/dist-packages/PySide2 +pyside3_install/py3*-relwithdebinfo/lib/python*/site-packages/PySide2/__init__.py usr/lib/python3/dist-packages/PySide2 +pyside3_install/py3*-relwithdebinfo/lib/python*/site-packages/PySide2/_config.py usr/lib/python3/dist-packages/PySide2 diff --git a/libpyside2-py3-5.11.lintian-overrides b/libpyside2-py3-5.11.lintian-overrides new file mode 100644 index 0000000..43676f9 --- /dev/null +++ b/libpyside2-py3-5.11.lintian-overrides @@ -0,0 +1,2 @@ +# We ship compiled versions for each supported python3 version, with a symlink to the default version +libpyside2-py3-5.11: package-name-doesnt-match-sonames libpyside2.cpython-36m-x86-64-linux-gnu5.11 libpyside2.cpython-37m-x86-64-linux-gnu5.11 diff --git a/libshiboken2-5.11.install b/libshiboken2-5.11.install new file mode 100755 index 0000000..673544c --- /dev/null +++ b/libshiboken2-5.11.install @@ -0,0 +1,2 @@ +#!/usr/bin/dh-exec +pyside2_install/py2*-relwithdebinfo/lib/libshiboken2-python2*.so.* usr/lib/${DEB_HOST_MULTIARCH} diff --git a/libshiboken2-5.11.lintian-overrides b/libshiboken2-5.11.lintian-overrides new file mode 100644 index 0000000..88bd81c --- /dev/null +++ b/libshiboken2-5.11.lintian-overrides @@ -0,0 +1,2 @@ +# We ship compiled versions for each supported python version, with a symlink to the default version +libshiboken2-5.11: package-name-doesnt-match-sonames libshiboken2-python2.7.x86-64-linux-gnu5.11 diff --git a/libshiboken2-dev.install b/libshiboken2-dev.install new file mode 100755 index 0000000..c74ccb3 --- /dev/null +++ b/libshiboken2-dev.install @@ -0,0 +1,7 @@ +#!/usr/bin/dh-exec --with=subst +pyside2_install/py2*-relwithdebinfo/include/shiboken2 usr/include +pyside2_install/py2*-relwithdebinfo/lib/pkgconfig/shiboken2.pc usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig +pyside2_install/py2*-relwithdebinfo/lib/libshiboken2*.so usr/lib/${DEB_HOST_MULTIARCH} +pyside3_install/py3*-relwithdebinfo/lib/libshiboken2*.so usr/lib/${DEB_HOST_MULTIARCH} +pyside2_install/py2*-relwithdebinfo/lib/cmake/Shiboken2* usr/lib/${DEB_HOST_MULTIARCH}/cmake +pyside3_install/py3*-relwithdebinfo/lib/cmake/Shiboken2*/Shiboken2Config.cpython* usr/lib/${DEB_HOST_MULTIARCH}/cmake/Shiboken2-${MAIN_VERSION_UPSTREAM} diff --git a/libshiboken2-py3-5.11.install b/libshiboken2-py3-5.11.install new file mode 100755 index 0000000..dd4920b --- /dev/null +++ b/libshiboken2-py3-5.11.install @@ -0,0 +1,2 @@ +#!/usr/bin/dh-exec +pyside3_install/py3*-relwithdebinfo/lib/libshiboken2*.so.* usr/lib/${DEB_HOST_MULTIARCH} diff --git a/libshiboken2-py3-5.11.lintian-overrides b/libshiboken2-py3-5.11.lintian-overrides new file mode 100644 index 0000000..fe1ec9c --- /dev/null +++ b/libshiboken2-py3-5.11.lintian-overrides @@ -0,0 +1,2 @@ +# We ship compiled versions for each supported python3 version, with a symlink to the default version +libshiboken2-py3-5.11: package-name-doesnt-match-sonames libshiboken2.cpython-36m-x86-64-linux-gnu5.11 libshiboken2.cpython-37m-x86-64-linux-gnu5.11 diff --git a/patches/drop-git-requirement.patch b/patches/drop-git-requirement.patch new file mode 100644 index 0000000..0227cbb --- /dev/null +++ b/patches/drop-git-requirement.patch @@ -0,0 +1,21 @@ +Description: Drop git requirement + Only to allow local build without git. +Author: Sophie Brun +Last-Update: 2018-07-06 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/build_scripts/main.py ++++ b/build_scripts/main.py +@@ -305,9 +305,9 @@ def get_qt_version(): + return qt_version + + def prepare_build(): +- if (os.path.isdir(".git") and not OPTION_IGNOREGIT and +- not OPTION_ONLYPACKAGE and not OPTION_REUSE_BUILD): +- prepare_sub_modules() ++ #if (os.path.isdir(".git") and not OPTION_IGNOREGIT and ++ # not OPTION_ONLYPACKAGE and not OPTION_REUSE_BUILD): ++ # prepare_sub_modules() + # Clean up temp and package folders + for n in [pyside_package_dir_name, "build"]: + d = os.path.join(setup_script_dir, n) diff --git a/patches/fix-spelling-errors.patch b/patches/fix-spelling-errors.patch new file mode 100644 index 0000000..c3dbc2d --- /dev/null +++ b/patches/fix-spelling-errors.patch @@ -0,0 +1,45 @@ +Description: Fix spelling errors +Author: Sophie Brun +Last-Update: 2018-07-12 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/sources/pyside2/libpyside/pysideproperty.cpp ++++ b/sources/pyside2/libpyside/pysideproperty.cpp +@@ -243,7 +243,7 @@ PyObject* qPropertySetter(PyObject* self + Py_INCREF(callback); + return callback; + } else { +- PyErr_SetString(PyExc_TypeError, "Invalid property setter agument."); ++ PyErr_SetString(PyExc_TypeError, "Invalid property setter argument."); + return 0; + } + } +@@ -260,7 +260,7 @@ PyObject* qPropertyGetter(PyObject* self + Py_INCREF(callback); + return callback; + } else { +- PyErr_SetString(PyExc_TypeError, "Invalid property getter agument."); ++ PyErr_SetString(PyExc_TypeError, "Invalid property getter argument."); + return 0; + } + } +@@ -360,7 +360,7 @@ int setValue(PySideProperty* self, PyObj + Shiboken::AutoDecRef result(PyObject_CallObject(fset, args)); + return (result.isNull() ? -1 : 0); + } else { +- PyErr_SetString(PyExc_AttributeError, "Attibute read only"); ++ PyErr_SetString(PyExc_AttributeError, "Attribute read only"); + } + return -1; + } +--- a/sources/shiboken2/ApiExtractor/typesystem.cpp ++++ b/sources/shiboken2/ApiExtractor/typesystem.cpp +@@ -1130,7 +1130,7 @@ bool Handler::startElement(const QString + } else if (modeName == QLatin1String("replace")) { + mode = TypeSystem::DocModificationReplace; + } else { +- m_error = QLatin1String("Unknow documentation injection mode: ") + modeName; ++ m_error = QLatin1String("Unknown documentation injection mode: ") + modeName; + return false; + } + diff --git a/patches/remove-privacy-breach-in-doc.patch b/patches/remove-privacy-breach-in-doc.patch new file mode 100644 index 0000000..c7598ce --- /dev/null +++ b/patches/remove-privacy-breach-in-doc.patch @@ -0,0 +1,33 @@ +Description: Remove privacy breach in documentation +Author: Sophie Brun +Last-Update: 2018-07-12 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/docs/index.rst ++++ b/docs/index.rst +@@ -2,25 +2,6 @@ + PySide + ====== + +-.. image:: https://pypip.in/wheel/PySide/badge.png +- :target: https://pypi.python.org/pypi/PySide/ +- :alt: Wheel Status +- +-.. image:: https://pypip.in/download/PySide/badge.png +- :target: https://pypi.python.org/pypi/PySide/ +- :alt: Downloads +- +-.. image:: https://pypip.in/version/PySide/badge.png +- :target: https://pypi.python.org/pypi/PySide/ +- :alt: Latest Version +- +-.. image:: https://pypip.in/license/PySide/badge.png +- :target: https://pypi.python.org/pypi/PySide/ +- :alt: License +- +-.. image:: https://readthedocs.org/projects/pip/badge/ +- :target: https://pyside.readthedocs.org +- + | + + Introduction diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..1627062 --- /dev/null +++ b/patches/series @@ -0,0 +1,4 @@ +fix-spelling-errors.patch +drop-git-requirement.patch +update-patchelf.patch +remove-privacy-breach-in-doc.patch diff --git a/patches/update-patchelf.patch b/patches/update-patchelf.patch new file mode 100644 index 0000000..747fea8 --- /dev/null +++ b/patches/update-patchelf.patch @@ -0,0 +1,3097 @@ +Update patchelf to current git version + +The current version fixes a bug which broke the ability to strip +binaries with debug symbols: +https://github.com/NixOS/patchelf/pull/117 + +With the former version of patchelf, I would get "not enough room for +program headers, try linking with -N" when trying to strip the binaries. + +This patch brings patchelf in sync with the commit +27ffe8ae871e7a186018d66020ef3f6162c12c69 of patchelf's git +repository. + +Also update patchelf's build process to match the logic in upstream's +automake files (thanks to Frédéric Bonnard for the patch to properly use +getconf PAGESIZE). + +Bug: https://bugreports.qt.io/browse/PYSIDE-740 +Last-Update: 2018-07-09 + +--- a/sources/patchelf/patchelf.cc ++++ b/sources/patchelf/patchelf.cc +@@ -1,91 +1,133 @@ ++/* ++ * PatchELF is a utility to modify properties of ELF executables and libraries ++ * Copyright (C) 2004-2016 Eelco Dolstra ++ * ++ * This program is free software: you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation, either version 3 of the License, or (at ++ * your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ + #include + #include + #include + #include + #include +- +-#include +-#include +-#include +-#include +-#include +-#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include + + #include + #include + #include + #include +-#include + + #include "elf.h" + +-using namespace std; + ++static bool debugMode = false; + +-#ifdef MIPSEL +-/* The lemote fuloong 2f kernel defconfig sets a page size of 16KB */ +-const unsigned int pageSize = 4096*4; +-#else +-const unsigned int pageSize = 4096; +-#endif ++static bool forceRPath = false; + ++static std::vector fileNames; ++static int pageSize = PAGESIZE; + +-static bool debugMode = false; ++typedef std::shared_ptr> FileContents; + +-static bool forceRPath = false; + +-static string fileName; ++#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Verneed ++#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Verneed + + +-off_t fileSize, maxSize; +-unsigned char * contents = 0; ++static std::vector splitColonDelimitedString(const char * s) ++{ ++ std::vector parts; ++ const char * pos = s; ++ while (*pos) { ++ const char * end = strchr(pos, ':'); ++ if (!end) end = strchr(pos, 0); + ++ parts.push_back(std::string(pos, end - pos)); ++ if (*end == ':') ++end; ++ pos = end; ++ } + +-#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym +-#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym ++ return parts; ++} ++ ++static bool hasAllowedPrefix(const std::string & s, const std::vector & allowedPrefixes) ++{ ++ for (auto & i : allowedPrefixes) ++ if (!s.compare(0, i.size(), i)) return true; ++ return false; ++} ++ ++ ++static unsigned int getPageSize() ++{ ++ return pageSize; ++} + + + template + class ElfFile + { ++public: ++ ++ const FileContents fileContents; ++ ++private: ++ ++ unsigned char * contents; ++ + Elf_Ehdr * hdr; +- vector phdrs; +- vector shdrs; ++ std::vector phdrs; ++ std::vector shdrs; + + bool littleEndian; + +- bool changed; ++ bool changed = false; + +- bool isExecutable; ++ bool isExecutable = false; + +- typedef string SectionName; +- typedef map ReplacedSections; ++ typedef std::string SectionName; ++ typedef std::map ReplacedSections; + + ReplacedSections replacedSections; + +- string sectionNames; /* content of the .shstrtab section */ ++ std::string sectionNames; /* content of the .shstrtab section */ + + /* Align on 4 or 8 bytes boundaries on 32- or 64-bit platforms + respectively. */ +- unsigned int sectionAlignment; ++ size_t sectionAlignment = sizeof(Elf_Off); + +- vector sectionsByOldIndex; ++ std::vector sectionsByOldIndex; + + public: + +- ElfFile() +- { +- changed = false; +- sectionAlignment = sizeof(Elf_Off); +- } ++ ElfFile(FileContents fileContents); + + bool isChanged() + { + return changed; + } + +- void parse(); +- + private: + + struct CompPhdr +@@ -93,8 +135,11 @@ private: + ElfFile * elfFile; + bool operator ()(const Elf_Phdr & x, const Elf_Phdr & y) + { +- if (x.p_type == PT_PHDR) return true; ++ // A PHDR comes before everything else. + if (y.p_type == PT_PHDR) return false; ++ if (x.p_type == PT_PHDR) return true; ++ ++ // Sort non-PHDRs by address. + return elfFile->rdi(x.p_paddr) < elfFile->rdi(y.p_paddr); + } + }; +@@ -118,7 +163,7 @@ private: + + void shiftFile(unsigned int extraPages, Elf_Addr startPage); + +- string getSectionName(const Elf_Shdr & shdr); ++ std::string getSectionName(const Elf_Shdr & shdr); + + Elf_Shdr & findSection(const SectionName & sectionName); + +@@ -126,9 +171,11 @@ private: + + unsigned int findSection3(const SectionName & sectionName); + +- string & replaceSection(const SectionName & sectionName, ++ std::string & replaceSection(const SectionName & sectionName, + unsigned int size); + ++ bool haveReplacedSection(const SectionName & sectionName); ++ + void writeReplacedSections(Elf_Off & curOff, + Elf_Addr startAddr, Elf_Off startOffset); + +@@ -142,15 +189,27 @@ public: + + void rewriteSections(); + +- string getInterpreter(); ++ std::string getInterpreter(); ++ ++ typedef enum { printSoname, replaceSoname } sonameMode; ++ ++ void modifySoname(sonameMode op, const std::string & newSoname); ++ ++ void setInterpreter(const std::string & newInterpreter); ++ ++ typedef enum { rpPrint, rpShrink, rpSet, rpRemove } RPathOp; + +- void setInterpreter(const string & newInterpreter); ++ void modifyRPath(RPathOp op, const std::vector & allowedRpathPrefixes, std::string newRPath); + +- typedef enum { rpPrint, rpShrink, rpSet } RPathOp; ++ void addNeeded(const std::set & libs); + +- void modifyRPath(RPathOp op, string newRPath); ++ void removeNeeded(const std::set & libs); + +- void removeNeeded(set libs); ++ void replaceNeeded(const std::map & libs); ++ ++ void printNeededLibs(); ++ ++ void noDefaultLib(); + + private: + +@@ -205,73 +264,151 @@ static void debug(const char * format, . + } + + +-static void error(string msg) ++void fmt2(std::ostringstream & out) + { +- if (errno) perror(msg.c_str()); else fprintf(stderr, "%s\n", msg.c_str()); +- exit(1); + } + + +-static void growFile(off_t newSize) ++template ++void fmt2(std::ostringstream & out, T x, Args... args) + { +- if (newSize > maxSize) error("maximum file size exceeded"); +- if (newSize <= fileSize) return; +- if (newSize > fileSize) +- memset(contents + fileSize, 0, newSize - fileSize); +- fileSize = newSize; ++ out << x; ++ fmt2(out, args...); + } + + +-static void readFile(string fileName, mode_t * fileMode) ++template ++std::string fmt(Args... args) ++{ ++ std::ostringstream out; ++ fmt2(out, args...); ++ return out.str(); ++} ++ ++ ++struct SysError : std::runtime_error ++{ ++ int errNo; ++ SysError(const std::string & msg) ++ : std::runtime_error(fmt(msg + ": " + strerror(errno))) ++ , errNo(errno) ++ { } ++}; ++ ++ ++__attribute__((noreturn)) static void error(std::string msg) ++{ ++ if (errno) ++ throw SysError(msg); ++ else ++ throw std::runtime_error(msg); ++} ++ ++ ++static void growFile(FileContents contents, size_t newSize) ++{ ++ if (newSize > contents->capacity()) error("maximum file size exceeded"); ++ if (newSize <= contents->size()) return; ++ contents->resize(newSize, 0); ++} ++ ++ ++static FileContents readFile(std::string fileName, ++ size_t cutOff = std::numeric_limits::max()) + { + struct stat st; +- if (stat(fileName.c_str(), &st) != 0) error("stat"); +- fileSize = st.st_size; +- *fileMode = st.st_mode; +- maxSize = fileSize + 8 * 1024 * 1024; ++ if (stat(fileName.c_str(), &st) != 0) ++ throw SysError(fmt("getting info about '", fileName, "'")); + +- contents = (unsigned char *) malloc(fileSize + maxSize); +- if (!contents) abort(); ++ if ((uint64_t) st.st_size > (uint64_t) std::numeric_limits::max()) ++ throw SysError(fmt("cannot read file of size ", st.st_size, " into memory")); ++ ++ size_t size = std::min(cutOff, (size_t) st.st_size); ++ ++ FileContents contents = std::make_shared>(); ++ contents->reserve(size + 32 * 1024 * 1024); ++ contents->resize(size, 0); + + int fd = open(fileName.c_str(), O_RDONLY); +- if (fd == -1) error("open"); ++ if (fd == -1) throw SysError(fmt("opening '", fileName, "'")); + +- if (read(fd, contents, fileSize) != fileSize) error("read"); ++ size_t bytesRead = 0; ++ ssize_t portion; ++ while ((portion = read(fd, contents->data() + bytesRead, size - bytesRead)) > 0) ++ bytesRead += portion; ++ ++ if (bytesRead != size) ++ throw SysError(fmt("reading '", fileName, "'")); + + close(fd); ++ ++ return contents; + } + + +-static void checkPointer(void * p, unsigned int size) ++struct ElfType ++{ ++ bool is32Bit; ++ int machine; // one of EM_* ++}; ++ ++ ++ElfType getElfType(const FileContents & fileContents) ++{ ++ /* Check the ELF header for basic validity. */ ++ if (fileContents->size() < (off_t) sizeof(Elf32_Ehdr)) error("missing ELF header"); ++ ++ auto contents = fileContents->data(); ++ ++ if (memcmp(contents, ELFMAG, SELFMAG) != 0) ++ error("not an ELF executable"); ++ ++ if (contents[EI_VERSION] != EV_CURRENT) ++ error("unsupported ELF version"); ++ ++ if (contents[EI_CLASS] != ELFCLASS32 && contents[EI_CLASS] != ELFCLASS64) ++ error("ELF executable is not 32 or 64 bit"); ++ ++ bool is32Bit = contents[EI_CLASS] == ELFCLASS32; ++ ++ // FIXME: endianness ++ return ElfType{is32Bit, is32Bit ? ((Elf32_Ehdr *) contents)->e_machine : ((Elf64_Ehdr *) contents)->e_machine}; ++} ++ ++ ++static void checkPointer(const FileContents & contents, void * p, unsigned int size) + { + unsigned char * q = (unsigned char *) p; +- assert(q >= contents && q + size <= contents + fileSize); ++ assert(q >= contents->data() && q + size <= contents->data() + contents->size()); + } + + + template +-void ElfFile::parse() ++ElfFile::ElfFile(FileContents fileContents) ++ : fileContents(fileContents) ++ , contents(fileContents->data()) + { +- isExecutable = false; +- + /* Check the ELF header for basic validity. */ +- if (fileSize < (off_t) sizeof(Elf_Ehdr)) error("missing ELF header"); ++ if (fileContents->size() < (off_t) sizeof(Elf_Ehdr)) error("missing ELF header"); + +- hdr = (Elf_Ehdr *) contents; ++ hdr = (Elf_Ehdr *) fileContents->data(); + + if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) + error("not an ELF executable"); + +- littleEndian = contents[EI_DATA] == ELFDATA2LSB; ++ littleEndian = hdr->e_ident[EI_DATA] == ELFDATA2LSB; + + if (rdi(hdr->e_type) != ET_EXEC && rdi(hdr->e_type) != ET_DYN) + error("wrong ELF type"); + +- if ((off_t) (rdi(hdr->e_phoff) + rdi(hdr->e_phnum) * rdi(hdr->e_phentsize)) > fileSize) +- error("missing program headers"); ++ if ((size_t) (rdi(hdr->e_phoff) + rdi(hdr->e_phnum) * rdi(hdr->e_phentsize)) > fileContents->size()) ++ error("program header table out of bounds"); + +- if ((off_t) (rdi(hdr->e_shoff) + rdi(hdr->e_shnum) * rdi(hdr->e_shentsize)) > fileSize) +- error("missing section headers"); ++ if (rdi(hdr->e_shnum) == 0) ++ error("no section headers. The input file is probably a statically linked, self-decompressing binary"); ++ ++ if ((size_t) (rdi(hdr->e_shoff) + rdi(hdr->e_shnum) * rdi(hdr->e_shentsize)) > fileContents->size()) ++ error("section header table out of bounds"); + + if (rdi(hdr->e_phentsize) != sizeof(Elf_Phdr)) + error("program headers have wrong size"); +@@ -292,12 +429,12 @@ void ElfFile::parse() + assert(shstrtabIndex < shdrs.size()); + unsigned int shstrtabSize = rdi(shdrs[shstrtabIndex].sh_size); + char * shstrtab = (char * ) contents + rdi(shdrs[shstrtabIndex].sh_offset); +- checkPointer(shstrtab, shstrtabSize); ++ checkPointer(fileContents, shstrtab, shstrtabSize); + + assert(shstrtabSize > 0); + assert(shstrtab[shstrtabSize - 1] == 0); + +- sectionNames = string(shstrtab, shstrtabSize); ++ sectionNames = std::string(shstrtab, shstrtabSize); + + sectionsByOldIndex.resize(hdr->e_shnum); + for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) +@@ -320,13 +457,13 @@ void ElfFile::sortShd + { + /* Translate sh_link mappings to section names, since sorting the + sections will invalidate the sh_link fields. */ +- map linkage; ++ std::map linkage; + for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) + if (rdi(shdrs[i].sh_link) != 0) + linkage[getSectionName(shdrs[i])] = getSectionName(shdrs[rdi(shdrs[i].sh_link)]); + + /* Idem for sh_info on certain sections. */ +- map info; ++ std::map info; + for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) + if (rdi(shdrs[i].sh_info) != 0 && + (rdi(shdrs[i].sh_type) == SHT_REL || rdi(shdrs[i].sh_type) == SHT_RELA)) +@@ -358,21 +495,22 @@ void ElfFile::sortShd + } + + +-static void writeFile(string fileName, mode_t fileMode) ++static void writeFile(std::string fileName, FileContents contents) + { +- string fileName2 = fileName + "_patchelf_tmp"; +- +- int fd = open(fileName2.c_str(), +- O_CREAT | O_TRUNC | O_WRONLY, 0700); +- if (fd == -1) error("open"); +- +- if (write(fd, contents, fileSize) != fileSize) error("write"); ++ int fd = open(fileName.c_str(), O_TRUNC | O_WRONLY); ++ if (fd == -1) ++ error("open"); ++ ++ size_t bytesWritten = 0; ++ ssize_t portion; ++ while ((portion = write(fd, contents->data() + bytesWritten, contents->size() - bytesWritten)) > 0) ++ bytesWritten += portion; + +- if (close(fd) != 0) error("close"); ++ if (bytesWritten != contents->size()) ++ error("write"); + +- if (chmod(fileName2.c_str(), fileMode) != 0) error("chmod"); +- +- if (rename(fileName2.c_str(), fileName.c_str()) != 0) error("rename"); ++ if (close(fd) != 0) ++ error("close"); + } + + +@@ -385,12 +523,12 @@ static unsigned int roundUp(unsigned int + template + void ElfFile::shiftFile(unsigned int extraPages, Elf_Addr startPage) + { +- /* Move the entire contents of the file `extraPages' pages ++ /* Move the entire contents of the file 'extraPages' pages + further. */ +- unsigned int oldSize = fileSize; +- unsigned int shift = extraPages * pageSize; +- growFile(fileSize + extraPages * pageSize); +- memmove(contents + extraPages * pageSize, contents, oldSize); ++ unsigned int oldSize = fileContents->size(); ++ unsigned int shift = extraPages * getPageSize(); ++ growFile(fileContents, fileContents->size() + extraPages * getPageSize()); ++ memmove(contents + extraPages * getPageSize(), contents, oldSize); + memset(contents + sizeof(Elf_Ehdr), 0, shift - sizeof(Elf_Ehdr)); + + /* Adjust the ELF header. */ +@@ -407,8 +545,8 @@ void ElfFile::shiftFi + if (rdi(phdrs[i].p_align) != 0 && + (rdi(phdrs[i].p_vaddr) - rdi(phdrs[i].p_offset)) % rdi(phdrs[i].p_align) != 0) { + debug("changing alignment of program header %d from %d to %d\n", i, +- rdi(phdrs[i].p_align), pageSize); +- wri(phdrs[i].p_align, pageSize); ++ rdi(phdrs[i].p_align), getPageSize()); ++ wri(phdrs[i].p_align, getPageSize()); + } + } + +@@ -422,14 +560,14 @@ void ElfFile::shiftFi + wri(phdr.p_vaddr, wri(phdr.p_paddr, startPage)); + wri(phdr.p_filesz, wri(phdr.p_memsz, shift)); + wri(phdr.p_flags, PF_R | PF_W); +- wri(phdr.p_align, pageSize); ++ wri(phdr.p_align, getPageSize()); + } + + + template +-string ElfFile::getSectionName(const Elf_Shdr & shdr) ++std::string ElfFile::getSectionName(const Elf_Shdr & shdr) + { +- return string(sectionNames.c_str() + rdi(shdr.sh_name)); ++ return std::string(sectionNames.c_str() + rdi(shdr.sh_name)); + } + + +@@ -437,8 +575,12 @@ template + Elf_Shdr & ElfFile::findSection(const SectionName & sectionName) + { + Elf_Shdr * shdr = findSection2(sectionName); +- if (!shdr) +- error("cannot find section " + sectionName); ++ if (!shdr) { ++ std::string extraMsg = ""; ++ if (sectionName == ".interp" || sectionName == ".dynamic" || sectionName == ".dynstr") ++ extraMsg = ". The input file is most likely statically linked"; ++ error("cannot find section '" + sectionName + "'" + extraMsg); ++ } + return *shdr; + } + +@@ -459,19 +601,28 @@ unsigned int ElfFile: + return 0; + } + ++template ++bool ElfFile::haveReplacedSection(const SectionName & sectionName) ++{ ++ ReplacedSections::iterator i = replacedSections.find(sectionName); ++ ++ if (i != replacedSections.end()) ++ return true; ++ return false; ++} + + template +-string & ElfFile::replaceSection(const SectionName & sectionName, ++std::string & ElfFile::replaceSection(const SectionName & sectionName, + unsigned int size) + { + ReplacedSections::iterator i = replacedSections.find(sectionName); +- string s; ++ std::string s; + + if (i != replacedSections.end()) { +- s = string(i->second); ++ s = std::string(i->second); + } else { + Elf_Shdr & shdr = findSection(sectionName); +- s = string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size)); ++ s = std::string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size)); + } + + s.resize(size); +@@ -488,29 +639,25 @@ void ElfFile::writeRe + /* Overwrite the old section contents with 'X's. Do this + *before* writing the new section contents (below) to prevent + clobbering previously written new section contents. */ +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- { +- string sectionName = i->first; ++ for (auto & i : replacedSections) { ++ std::string sectionName = i.first; + Elf_Shdr & shdr = findSection(sectionName); + memset(contents + rdi(shdr.sh_offset), 'X', rdi(shdr.sh_size)); + } + +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- { +- string sectionName = i->first; ++ for (auto & i : replacedSections) { ++ std::string sectionName = i.first; + Elf_Shdr & shdr = findSection(sectionName); +- debug("rewriting section `%s' from offset 0x%x (size %d) to offset 0x%x (size %d)\n", +- sectionName.c_str(), rdi(shdr.sh_offset), rdi(shdr.sh_size), curOff, i->second.size()); ++ debug("rewriting section '%s' from offset 0x%x (size %d) to offset 0x%x (size %d)\n", ++ sectionName.c_str(), rdi(shdr.sh_offset), rdi(shdr.sh_size), curOff, i.second.size()); + +- memcpy(contents + curOff, (unsigned char *) i->second.c_str(), +- i->second.size()); ++ memcpy(contents + curOff, (unsigned char *) i.second.c_str(), ++ i.second.size()); + + /* Update the section header for this section. */ + wri(shdr.sh_offset, curOff); + wri(shdr.sh_addr, startAddr + (curOff - startOffset)); +- wri(shdr.sh_size, i->second.size()); ++ wri(shdr.sh_size, i.second.size()); + wri(shdr.sh_addralign, sectionAlignment); + + /* If this is the .interp section, then the PT_INTERP segment +@@ -535,7 +682,7 @@ void ElfFile::writeRe + } + } + +- curOff += roundUp(i->second.size(), sectionAlignment); ++ curOff += roundUp(i.second.size(), sectionAlignment); + } + + replacedSections.clear(); +@@ -551,58 +698,57 @@ void ElfFile::rewrite + page of other segments. */ + Elf_Addr startPage = 0; + for (unsigned int i = 0; i < phdrs.size(); ++i) { +- Elf_Addr thisPage = roundUp(rdi(phdrs[i].p_vaddr) + rdi(phdrs[i].p_memsz), pageSize); ++ Elf_Addr thisPage = roundUp(rdi(phdrs[i].p_vaddr) + rdi(phdrs[i].p_memsz), getPageSize()); + if (thisPage > startPage) startPage = thisPage; + } + + debug("last page is 0x%llx\n", (unsigned long long) startPage); + +- +- /* Compute the total space needed for the replaced sections and +- the program headers. */ +- off_t neededSpace = (phdrs.size() + 1) * sizeof(Elf_Phdr); +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- neededSpace += roundUp(i->second.size(), sectionAlignment); ++ /* Because we're adding a new section header, we're necessarily increasing ++ the size of the program header table. This can cause the first section ++ to overlap the program header table in memory; we need to shift the first ++ few segments to someplace else. */ ++ /* Some sections may already be replaced so account for that */ ++ unsigned int i = 1; ++ Elf_Addr pht_size = sizeof(Elf_Ehdr) + (phdrs.size() + 1)*sizeof(Elf_Phdr); ++ while( shdrs[i].sh_addr <= pht_size && i < rdi(hdr->e_shnum) ) { ++ if (not haveReplacedSection(getSectionName(shdrs[i]))) ++ replaceSection(getSectionName(shdrs[i]), shdrs[i].sh_size); ++ i++; ++ } ++ ++ /* Compute the total space needed for the replaced sections */ ++ off_t neededSpace = 0; ++ for (auto & i : replacedSections) ++ neededSpace += roundUp(i.second.size(), sectionAlignment); + debug("needed space is %d\n", neededSpace); + ++ size_t startOffset = roundUp(fileContents->size(), getPageSize()); + +- size_t startOffset = roundUp(fileSize, pageSize); +- +- growFile(startOffset + neededSpace); +- ++ growFile(fileContents, startOffset + neededSpace); + + /* Even though this file is of type ET_DYN, it could actually be + an executable. For instance, Gold produces executables marked +- ET_DYN. In that case we can still hit the kernel bug that +- necessitated rewriteSectionsExecutable(). However, such +- executables also tend to start at virtual address 0, so ++ ET_DYN as does LD when linking with pie. If we move PT_PHDR, it ++ has to stay in the first PT_LOAD segment or any subsequent ones ++ if they're continuous in memory due to linux kernel constraints ++ (see BUGS). Since the end of the file would be after bss, we can't ++ move PHDR there, we therefore choose to leave PT_PHDR where it is but ++ move enough following sections such that we can add the extra PT_LOAD ++ section to it. This PT_LOAD segment ensures the sections at the end of ++ the file are mapped into memory for ld.so to process. ++ We can't use the approach in rewriteSectionsExecutable() ++ since DYN executables tend to start at virtual address 0, so + rewriteSectionsExecutable() won't work because it doesn't have +- any virtual address space to grow downwards into. As a +- workaround, make sure that the virtual address of our new +- PT_LOAD segment relative to the first PT_LOAD segment is equal +- to its offset; otherwise we hit the kernel bug. This may +- require creating a hole in the executable. The bigger the size +- of the uninitialised data segment, the bigger the hole. */ ++ any virtual address space to grow downwards into. */ + if (isExecutable) { + if (startOffset >= startPage) { + debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); +- } else { +- size_t hole = startPage - startOffset; +- /* Print a warning, because the hole could be very big. */ +- fprintf(stderr, "warning: working around a Linux kernel bug by creating a hole of %zu bytes in ‘%s’\n", hole, fileName.c_str()); +- assert(hole % pageSize == 0); +- /* !!! We could create an actual hole in the file here, +- but it's probably not worth the effort. */ +- growFile(fileSize + hole); +- startOffset += hole; + } + startPage = startOffset; + } + +- +- /* Add a segment that maps the replaced sections and program +- headers into memory. */ ++ /* Add a segment that maps the replaced sections into memory. */ + phdrs.resize(rdi(hdr->e_phnum) + 1); + wri(hdr->e_phnum, rdi(hdr->e_phnum) + 1); + Elf_Phdr & phdr = phdrs[rdi(hdr->e_phnum) - 1]; +@@ -611,19 +757,16 @@ void ElfFile::rewrite + wri(phdr.p_vaddr, wri(phdr.p_paddr, startPage)); + wri(phdr.p_filesz, wri(phdr.p_memsz, neededSpace)); + wri(phdr.p_flags, PF_R | PF_W); +- wri(phdr.p_align, pageSize); ++ wri(phdr.p_align, getPageSize()); + + + /* Write out the replaced sections. */ +- Elf_Off curOff = startOffset + phdrs.size() * sizeof(Elf_Phdr); ++ Elf_Off curOff = startOffset; + writeReplacedSections(curOff, startPage, startOffset); +- assert((off_t) curOff == startOffset + neededSpace); +- +- +- /* Move the program header to the start of the new area. */ +- wri(hdr->e_phoff, startOffset); ++ assert(curOff == startOffset + neededSpace); + +- rewriteHeaders(startPage); ++ /* Write out the updated program and section headers */ ++ rewriteHeaders(hdr->e_phoff); + } + + +@@ -638,9 +781,9 @@ void ElfFile::rewrite + /* What is the index of the last replaced section? */ + unsigned int lastReplaced = 0; + for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) { +- string sectionName = getSectionName(shdrs[i]); ++ std::string sectionName = getSectionName(shdrs[i]); + if (replacedSections.find(sectionName) != replacedSections.end()) { +- debug("using replaced section `%s'\n", sectionName.c_str()); ++ debug("using replaced section '%s'\n", sectionName.c_str()); + lastReplaced = i; + } + } +@@ -656,11 +799,11 @@ void ElfFile::rewrite + assert(lastReplaced + 1 < shdrs.size()); /* !!! I'm lazy. */ + size_t startOffset = rdi(shdrs[lastReplaced + 1].sh_offset); + Elf_Addr startAddr = rdi(shdrs[lastReplaced + 1].sh_addr); +- string prevSection; ++ std::string prevSection; + for (unsigned int i = 1; i <= lastReplaced; ++i) { + Elf_Shdr & shdr(shdrs[i]); +- string sectionName = getSectionName(shdr); +- debug("looking at section `%s'\n", sectionName.c_str()); ++ std::string sectionName = getSectionName(shdr); ++ debug("looking at section '%s'\n", sectionName.c_str()); + /* !!! Why do we stop after a .dynstr section? I can't + remember! */ + if ((rdi(shdr.sh_type) == SHT_PROGBITS && sectionName != ".interp") +@@ -672,7 +815,7 @@ void ElfFile::rewrite + break; + } else { + if (replacedSections.find(sectionName) == replacedSections.end()) { +- debug("replacing section `%s' which is in the way\n", sectionName.c_str()); ++ debug("replacing section '%s' which is in the way\n", sectionName.c_str()); + replaceSection(sectionName, rdi(shdr.sh_size)); + } + } +@@ -682,23 +825,33 @@ void ElfFile::rewrite + debug("first reserved offset/addr is 0x%x/0x%llx\n", + startOffset, (unsigned long long) startAddr); + +- assert(startAddr % pageSize == startOffset % pageSize); ++ assert(startAddr % getPageSize() == startOffset % getPageSize()); + Elf_Addr firstPage = startAddr - startOffset; + debug("first page is 0x%llx\n", (unsigned long long) firstPage); + +- /* Right now we assume that the section headers are somewhere near +- the end, which appears to be the case most of the time. +- Therefore they're not accidentally overwritten by the replaced +- sections. !!! Fix this. */ +- assert((off_t) rdi(hdr->e_shoff) >= startOffset); ++ if (rdi(hdr->e_shoff) < startOffset) { ++ /* The section headers occur too early in the file and would be ++ overwritten by the replaced sections. Move them to the end of the file ++ before proceeding. */ ++ off_t shoffNew = fileContents->size(); ++ off_t shSize = rdi(hdr->e_shoff) + rdi(hdr->e_shnum) * rdi(hdr->e_shentsize); ++ growFile(fileContents, fileContents->size() + shSize); ++ wri(hdr->e_shoff, shoffNew); ++ ++ /* Rewrite the section header table. For neatness, keep the ++ sections sorted. */ ++ assert(rdi(hdr->e_shnum) == shdrs.size()); ++ sortShdrs(); ++ for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) ++ * ((Elf_Shdr *) (contents + rdi(hdr->e_shoff)) + i) = shdrs[i]; ++ } + + + /* Compute the total space needed for the replaced sections, the + ELF header, and the program headers. */ + size_t neededSpace = sizeof(Elf_Ehdr) + phdrs.size() * sizeof(Elf_Phdr); +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- neededSpace += roundUp(i->second.size(), sectionAlignment); ++ for (auto & i : replacedSections) ++ neededSpace += roundUp(i.second.size(), sectionAlignment); + + debug("needed space is %d\n", neededSpace); + +@@ -711,13 +864,13 @@ void ElfFile::rewrite + neededSpace += sizeof(Elf_Phdr); + debug("needed space is %d\n", neededSpace); + +- unsigned int neededPages = roundUp(neededSpace - startOffset, pageSize) / pageSize; ++ unsigned int neededPages = roundUp(neededSpace - startOffset, getPageSize()) / getPageSize(); + debug("needed pages is %d\n", neededPages); +- if (neededPages * pageSize > firstPage) ++ if (neededPages * getPageSize() > firstPage) + error("virtual address space underrun!"); + +- firstPage -= neededPages * pageSize; +- startOffset += neededPages * pageSize; ++ firstPage -= neededPages * getPageSize(); ++ startOffset += neededPages * getPageSize(); + + shiftFile(neededPages, firstPage); + } +@@ -731,7 +884,7 @@ void ElfFile::rewrite + + /* Write out the replaced sections. */ + writeReplacedSections(curOff, firstPage, 0); +- assert((off_t) curOff == neededSpace); ++ assert(curOff == neededSpace); + + + rewriteHeaders(firstPage + rdi(hdr->e_phoff)); +@@ -743,10 +896,9 @@ void ElfFile::rewrite + { + if (replacedSections.empty()) return; + +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- debug("replacing section `%s' with size %d\n", +- i->first.c_str(), i->second.size()); ++ for (auto & i : replacedSections) ++ debug("replacing section '%s' with size %d\n", ++ i.first.c_str(), i.second.size()); + + if (rdi(hdr->e_type) == ET_DYN) { + debug("this is a dynamic library\n"); +@@ -764,11 +916,14 @@ void ElfFile::rewrite + /* Rewrite the program header table. */ + + /* If there is a segment for the program header table, update it. +- (According to the ELF spec, it must be the first entry.) */ +- if (rdi(phdrs[0].p_type) == PT_PHDR) { +- phdrs[0].p_offset = hdr->e_phoff; +- wri(phdrs[0].p_vaddr, wri(phdrs[0].p_paddr, phdrAddress)); +- wri(phdrs[0].p_filesz, wri(phdrs[0].p_memsz, phdrs.size() * sizeof(Elf_Phdr))); ++ (According to the ELF spec, there can only be one.) */ ++ for (unsigned int i = 0; i < phdrs.size(); ++i) { ++ if (rdi(phdrs[i].p_type) == PT_PHDR) { ++ phdrs[i].p_offset = hdr->e_phoff; ++ wri(phdrs[i].p_vaddr, wri(phdrs[i].p_paddr, phdrAddress)); ++ wri(phdrs[i].p_filesz, wri(phdrs[i].p_memsz, phdrs.size() * sizeof(Elf_Phdr))); ++ break; ++ } + } + + sortPhdrs(); +@@ -815,11 +970,18 @@ void ElfFile::rewrite + /* no idea if this makes sense, but it was needed for some + program */ + if (!shdr) shdr = findSection2(".rel.got"); +- if (!shdr) error("cannot find .rel.dyn or .rel.got"); ++ /* some programs have neither section, but this doesn't seem ++ to be a problem */ ++ if (!shdr) continue; ++ dyn->d_un.d_ptr = shdr->sh_addr; ++ } ++ else if (d_tag == DT_RELA) { ++ Elf_Shdr * shdr = findSection2(".rela.dyn"); ++ /* some programs lack this section, but it doesn't seem to ++ be a problem */ ++ if (!shdr) continue; + dyn->d_un.d_ptr = shdr->sh_addr; + } +- else if (d_tag == DT_RELA) +- dyn->d_un.d_ptr = findSection(".rela.dyn").sh_addr; /* PPC Linux */ + else if (d_tag == DT_VERNEED) + dyn->d_un.d_ptr = findSection(".gnu.version_r").sh_addr; + else if (d_tag == DT_VERSYM) +@@ -835,12 +997,21 @@ void ElfFile::rewrite + debug("rewriting symbol table section %d\n", i); + for (size_t entry = 0; (entry + 1) * sizeof(Elf_Sym) <= rdi(shdrs[i].sh_size); entry++) { + Elf_Sym * sym = (Elf_Sym *) (contents + rdi(shdrs[i].sh_offset) + entry * sizeof(Elf_Sym)); +- if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) { +- string section = sectionsByOldIndex[rdi(sym->st_shndx)]; ++ unsigned int shndx = rdi(sym->st_shndx); ++ if (shndx != SHN_UNDEF && shndx < SHN_LORESERVE) { ++ if (shndx >= sectionsByOldIndex.size()) { ++ fprintf(stderr, "warning: entry %d in symbol table refers to a non-existent section, skipping\n", shndx); ++ continue; ++ } ++ std::string section = sectionsByOldIndex.at(shndx); + assert(!section.empty()); + unsigned int newIndex = findSection3(section); // inefficient +- //debug("rewriting symbol %d: index = %d (%s) -> %d\n", entry, rdi(sym->st_shndx), section.c_str(), newIndex); ++ //debug("rewriting symbol %d: index = %d (%s) -> %d\n", entry, shndx, section.c_str(), newIndex); + wri(sym->st_shndx, newIndex); ++ /* Rewrite st_value. FIXME: we should do this for all ++ types, but most don't actually change. */ ++ if (ELF32_ST_TYPE(rdi(sym->st_info)) == STT_SECTION) ++ wri(sym->st_value, rdi(shdrs[newIndex].sh_addr)); + } + } + } +@@ -848,7 +1019,7 @@ void ElfFile::rewrite + + + +-static void setSubstr(string & s, unsigned int pos, const string & t) ++static void setSubstr(std::string & s, unsigned int pos, const std::string & t) + { + assert(pos + t.size() <= s.size()); + copy(t.begin(), t.end(), s.begin() + pos); +@@ -856,23 +1027,102 @@ static void setSubstr(string & s, unsign + + + template +-string ElfFile::getInterpreter() ++std::string ElfFile::getInterpreter() + { + Elf_Shdr & shdr = findSection(".interp"); +- return string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size)); ++ return std::string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size)); + } + ++template ++void ElfFile::modifySoname(sonameMode op, const std::string & newSoname) ++{ ++ if (rdi(hdr->e_type) != ET_DYN) { ++ debug("this is not a dynamic library\n"); ++ return; ++ } ++ ++ Elf_Shdr & shdrDynamic = findSection(".dynamic"); ++ Elf_Shdr & shdrDynStr = findSection(".dynstr"); ++ char * strTab = (char *) contents + rdi(shdrDynStr.sh_offset); ++ ++ /* Walk through the dynamic section, look for the DT_SONAME entry. */ ++ Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ Elf_Dyn * dynSoname = 0; ++ char * soname = 0; ++ for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) { ++ if (rdi(dyn->d_tag) == DT_SONAME) { ++ dynSoname = dyn; ++ soname = strTab + rdi(dyn->d_un.d_val); ++ } ++ } ++ ++ if (op == printSoname) { ++ if (soname) { ++ if (std::string(soname ? soname : "") == "") ++ debug("DT_SONAME is empty\n"); ++ else ++ printf("%s\n", soname); ++ } else { ++ debug("no DT_SONAME found\n"); ++ } ++ return; ++ } ++ ++ if (std::string(soname ? soname : "") == newSoname) { ++ debug("current and proposed new SONAMEs are equal keeping DT_SONAME entry\n"); ++ return; ++ } ++ ++ /* Zero out the previous SONAME */ ++ unsigned int sonameSize = 0; ++ if (soname) { ++ sonameSize = strlen(soname); ++ memset(soname, 'X', sonameSize); ++ } ++ ++ debug("new SONAME is '%s'\n", newSoname.c_str()); ++ ++ /* Grow the .dynstr section to make room for the new SONAME. */ ++ debug("SONAME is too long, resizing...\n"); ++ ++ std::string & newDynStr = replaceSection(".dynstr", rdi(shdrDynStr.sh_size) + newSoname.size() + 1); ++ setSubstr(newDynStr, rdi(shdrDynStr.sh_size), newSoname + '\0'); ++ ++ /* Update the DT_SONAME entry. */ ++ if (dynSoname) { ++ dynSoname->d_un.d_val = shdrDynStr.sh_size; ++ } else { ++ /* There is no DT_SONAME entry in the .dynamic section, so we ++ have to grow the .dynamic section. */ ++ std::string & newDynamic = replaceSection(".dynamic", rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn)); ++ ++ unsigned int idx = 0; ++ for (; rdi(((Elf_Dyn *) newDynamic.c_str())[idx].d_tag) != DT_NULL; idx++); ++ debug("DT_NULL index is %d\n", idx); ++ ++ /* Shift all entries down by one. */ ++ setSubstr(newDynamic, sizeof(Elf_Dyn), std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1))); ++ ++ /* Add the DT_SONAME entry at the top. */ ++ Elf_Dyn newDyn; ++ wri(newDyn.d_tag, DT_SONAME); ++ newDyn.d_un.d_val = shdrDynStr.sh_size; ++ setSubstr(newDynamic, 0, std::string((char *)&newDyn, sizeof(Elf_Dyn))); ++ } ++ ++ changed = true; ++} + + template +-void ElfFile::setInterpreter(const string & newInterpreter) ++void ElfFile::setInterpreter(const std::string & newInterpreter) + { +- string & section = replaceSection(".interp", newInterpreter.size() + 1); ++ std::string & section = replaceSection(".interp", newInterpreter.size() + 1); + setSubstr(section, 0, newInterpreter + '\0'); + changed = true; + } + + +-static void concatToRPath(string & rpath, const string & path) ++static void concatToRPath(std::string & rpath, const std::string & path) + { + if (!rpath.empty()) rpath += ":"; + rpath += path; +@@ -880,7 +1130,8 @@ static void concatToRPath(string & rpath + + + template +-void ElfFile::modifyRPath(RPathOp op, string newRPath) ++void ElfFile::modifyRPath(RPathOp op, ++ const std::vector & allowedRpathPrefixes, std::string newRPath) + { + Elf_Shdr & shdrDynamic = findSection(".dynamic"); + +@@ -889,15 +1140,6 @@ void ElfFile::modifyR + Elf_Shdr & shdrDynStr = findSection(".dynstr"); + char * strTab = (char *) contents + rdi(shdrDynStr.sh_offset); + +- /* Find the DT_STRTAB entry in the dynamic section. */ +- Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); +- Elf_Addr strTabAddr = 0; +- for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) +- if (rdi(dyn->d_tag) == DT_STRTAB) strTabAddr = rdi(dyn->d_un.d_ptr); +- if (!strTabAddr) error("strange: no string table"); +- +- assert(strTabAddr == rdi(shdrDynStr.sh_addr)); +- + + /* Walk through the dynamic section, look for the RPATH/RUNPATH + entry. +@@ -907,12 +1149,12 @@ void ElfFile::modifyR + overriden by LD_LIBRARY_PATH, and it's scoped (the DT_RUNPATH + for an executable or library doesn't affect the search path for + libraries used by it). DT_RPATH is ignored if DT_RUNPATH is +- present. The binutils `ld' still generates only DT_RPATH, +- unless you use its `--enable-new-dtag' option, in which case it ++ present. The binutils 'ld' still generates only DT_RPATH, ++ unless you use its '--enable-new-dtag' option, in which case it + generates a DT_RPATH and DT_RUNPATH pointing at the same + string. */ +- static vector neededLibs; +- dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ std::vector neededLibs; ++ Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); + Elf_Dyn * dynRPath = 0, * dynRunPath = 0; + char * rpath = 0; + for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) { +@@ -927,7 +1169,7 @@ void ElfFile::modifyR + rpath = strTab + rdi(dyn->d_un.d_val); + } + else if (rdi(dyn->d_tag) == DT_NEEDED) +- neededLibs.push_back(string(strTab + rdi(dyn->d_un.d_val))); ++ neededLibs.push_back(std::string(strTab + rdi(dyn->d_un.d_val))); + } + + if (op == rpPrint) { +@@ -944,19 +1186,11 @@ void ElfFile::modifyR + /* For each directory in the RPATH, check if it contains any + needed library. */ + if (op == rpShrink) { +- static vector neededLibFound(neededLibs.size(), false); ++ std::vector neededLibFound(neededLibs.size(), false); + + newRPath = ""; + +- char * pos = rpath; +- while (*pos) { +- char * end = strchr(pos, ':'); +- if (!end) end = strchr(pos, 0); +- +- /* Get the name of the directory. */ +- string dirName(pos, end - pos); +- if (*end == ':') ++end; +- pos = end; ++ for (auto & dirName : splitColonDelimitedString(rpath)) { + + /* Non-absolute entries are allowed (e.g., the special + "$ORIGIN" hack). */ +@@ -965,28 +1199,62 @@ void ElfFile::modifyR + continue; + } + ++ /* If --allowed-rpath-prefixes was given, reject directories ++ not starting with any of the (colon-delimited) prefixes. */ ++ if (!allowedRpathPrefixes.empty() && !hasAllowedPrefix(dirName, allowedRpathPrefixes)) { ++ debug("removing directory '%s' from RPATH because of non-allowed prefix\n", dirName.c_str()); ++ continue; ++ } ++ + /* For each library that we haven't found yet, see if it + exists in this directory. */ + bool libFound = false; + for (unsigned int j = 0; j < neededLibs.size(); ++j) + if (!neededLibFound[j]) { +- string libName = dirName + "/" + neededLibs[j]; +- struct stat st; +- if (stat(libName.c_str(), &st) == 0) { +- neededLibFound[j] = true; +- libFound = true; ++ std::string libName = dirName + "/" + neededLibs[j]; ++ try { ++ if (getElfType(readFile(libName, sizeof(Elf32_Ehdr))).machine == rdi(hdr->e_machine)) { ++ neededLibFound[j] = true; ++ libFound = true; ++ } else ++ debug("ignoring library '%s' because its machine type differs\n", libName.c_str()); ++ } catch (SysError & e) { ++ if (e.errNo != ENOENT) throw; + } + } + + if (!libFound) +- debug("removing directory `%s' from RPATH\n", dirName.c_str()); ++ debug("removing directory '%s' from RPATH\n", dirName.c_str()); + else + concatToRPath(newRPath, dirName); + } + } + ++ if (op == rpRemove) { ++ if (!rpath) { ++ debug("no RPATH to delete\n"); ++ return; ++ } + +- if (string(rpath ? rpath : "") == newRPath) return; ++ Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ Elf_Dyn * last = dyn; ++ for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) { ++ if (rdi(dyn->d_tag) == DT_RPATH) { ++ debug("removing DT_RPATH entry\n"); ++ changed = true; ++ } else if (rdi(dyn->d_tag) == DT_RUNPATH) { ++ debug("removing DT_RUNPATH entry\n"); ++ changed = true; ++ } else { ++ *last++ = *dyn; ++ } ++ } ++ memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); ++ return; ++ } ++ ++ ++ if (std::string(rpath ? rpath : "") == newRPath) return; + + changed = true; + +@@ -998,7 +1266,7 @@ void ElfFile::modifyR + memset(rpath, 'X', rpathSize); + } + +- debug("new rpath is `%s'\n", newRPath.c_str()); ++ debug("new rpath is '%s'\n", newRPath.c_str()); + + if (!forceRPath && dynRPath && !dynRunPath) { /* convert DT_RPATH to DT_RUNPATH */ + dynRPath->d_tag = DT_RUNPATH; +@@ -1018,7 +1286,7 @@ void ElfFile::modifyR + /* Grow the .dynstr section to make room for the new RPATH. */ + debug("rpath is too long, resizing...\n"); + +- string & newDynStr = replaceSection(".dynstr", ++ std::string & newDynStr = replaceSection(".dynstr", + rdi(shdrDynStr.sh_size) + newRPath.size() + 1); + setSubstr(newDynStr, rdi(shdrDynStr.sh_size), newRPath + '\0'); + +@@ -1031,7 +1299,7 @@ void ElfFile::modifyR + else { + /* There is no DT_RUNPATH entry in the .dynamic section, so we + have to grow the .dynamic section. */ +- string & newDynamic = replaceSection(".dynamic", ++ std::string & newDynamic = replaceSection(".dynamic", + rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn)); + + unsigned int idx = 0; +@@ -1040,19 +1308,19 @@ void ElfFile::modifyR + + /* Shift all entries down by one. */ + setSubstr(newDynamic, sizeof(Elf_Dyn), +- string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1))); ++ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1))); + + /* Add the DT_RUNPATH entry at the top. */ + Elf_Dyn newDyn; + wri(newDyn.d_tag, forceRPath ? DT_RPATH : DT_RUNPATH); + newDyn.d_un.d_val = shdrDynStr.sh_size; +- setSubstr(newDynamic, 0, string((char *) &newDyn, sizeof(Elf_Dyn))); ++ setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn))); + } + } + + + template +-void ElfFile::removeNeeded(set libs) ++void ElfFile::removeNeeded(const std::set & libs) + { + if (libs.empty()) return; + +@@ -1066,10 +1334,10 @@ void ElfFile::removeN + if (rdi(dyn->d_tag) == DT_NEEDED) { + char * name = strTab + rdi(dyn->d_un.d_val); + if (libs.find(name) != libs.end()) { +- debug("removing DT_NEEDED entry `%s'\n", name); ++ debug("removing DT_NEEDED entry '%s'\n", name); + changed = true; + } else { +- debug("keeping DT_NEEDED entry `%s'\n", name); ++ debug("keeping DT_NEEDED entry '%s'\n", name); + *last++ = *dyn; + } + } else +@@ -1079,96 +1347,309 @@ void ElfFile::removeN + memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); + } + ++template ++void ElfFile::replaceNeeded(const std::map & libs) ++{ ++ if (libs.empty()) return; + +-static bool printInterpreter = false; +-static string newInterpreter; ++ Elf_Shdr & shdrDynamic = findSection(".dynamic"); ++ Elf_Shdr & shdrDynStr = findSection(".dynstr"); ++ char * strTab = (char *) contents + rdi(shdrDynStr.sh_offset); ++ ++ Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ ++ unsigned int verNeedNum = 0; ++ ++ unsigned int dynStrAddedBytes = 0; ++ ++ for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) { ++ if (rdi(dyn->d_tag) == DT_NEEDED) { ++ char * name = strTab + rdi(dyn->d_un.d_val); ++ auto i = libs.find(name); ++ if (i != libs.end()) { ++ auto replacement = i->second; + ++ debug("replacing DT_NEEDED entry '%s' with '%s'\n", name, replacement.c_str()); ++ ++ // technically, the string referred by d_val could be used otherwise, too (although unlikely) ++ // we'll therefore add a new string ++ debug("resizing .dynstr ...\n"); ++ ++ std::string & newDynStr = replaceSection(".dynstr", ++ rdi(shdrDynStr.sh_size) + replacement.size() + 1 + dynStrAddedBytes); ++ setSubstr(newDynStr, rdi(shdrDynStr.sh_size) + dynStrAddedBytes, replacement + '\0'); ++ ++ wri(dyn->d_un.d_val, rdi(shdrDynStr.sh_size) + dynStrAddedBytes); ++ ++ dynStrAddedBytes += replacement.size() + 1; ++ ++ changed = true; ++ } else { ++ debug("keeping DT_NEEDED entry '%s'\n", name); ++ } ++ } ++ if (rdi(dyn->d_tag) == DT_VERNEEDNUM) { ++ verNeedNum = rdi(dyn->d_un.d_val); ++ } ++ } ++ ++ // If a replaced library uses symbol versions, then there will also be ++ // references to it in the "version needed" table, and these also need to ++ // be replaced. ++ ++ if (verNeedNum) { ++ Elf_Shdr & shdrVersionR = findSection(".gnu.version_r"); ++ // The filename strings in the .gnu.version_r are different from the ++ // ones in .dynamic: instead of being in .dynstr, they're in some ++ // arbitrary section and we have to look in ->sh_link to figure out ++ // which one. ++ Elf_Shdr & shdrVersionRStrings = shdrs[rdi(shdrVersionR.sh_link)]; ++ // this is where we find the actual filename strings ++ char * verStrTab = (char *) contents + rdi(shdrVersionRStrings.sh_offset); ++ // and we also need the name of the section containing the strings, so ++ // that we can pass it to replaceSection ++ std::string versionRStringsSName = getSectionName(shdrVersionRStrings); ++ ++ debug("found .gnu.version_r with %i entries, strings in %s\n", verNeedNum, versionRStringsSName.c_str()); ++ ++ unsigned int verStrAddedBytes = 0; ++ ++ Elf_Verneed * need = (Elf_Verneed *) (contents + rdi(shdrVersionR.sh_offset)); ++ while (verNeedNum > 0) { ++ char * file = verStrTab + rdi(need->vn_file); ++ auto i = libs.find(file); ++ if (i != libs.end()) { ++ auto replacement = i->second; ++ ++ debug("replacing .gnu.version_r entry '%s' with '%s'\n", file, replacement.c_str()); ++ debug("resizing string section %s ...\n", versionRStringsSName.c_str()); ++ ++ std::string & newVerDynStr = replaceSection(versionRStringsSName, ++ rdi(shdrVersionRStrings.sh_size) + replacement.size() + 1 + verStrAddedBytes); ++ setSubstr(newVerDynStr, rdi(shdrVersionRStrings.sh_size) + verStrAddedBytes, replacement + '\0'); ++ ++ wri(need->vn_file, rdi(shdrVersionRStrings.sh_size) + verStrAddedBytes); ++ ++ verStrAddedBytes += replacement.size() + 1; ++ ++ changed = true; ++ } else { ++ debug("keeping .gnu.version_r entry '%s'\n", file); ++ } ++ // the Elf_Verneed structures form a linked list, so jump to next entry ++ need = (Elf_Verneed *) (((char *) need) + rdi(need->vn_next)); ++ --verNeedNum; ++ } ++ } ++} ++ ++template ++void ElfFile::addNeeded(const std::set & libs) ++{ ++ if (libs.empty()) return; ++ ++ Elf_Shdr & shdrDynamic = findSection(".dynamic"); ++ Elf_Shdr & shdrDynStr = findSection(".dynstr"); ++ ++ /* add all new libs to the dynstr string table */ ++ unsigned int length = 0; ++ for (auto & i : libs) length += i.size() + 1; ++ ++ std::string & newDynStr = replaceSection(".dynstr", ++ rdi(shdrDynStr.sh_size) + length + 1); ++ std::set libStrings; ++ unsigned int pos = 0; ++ for (auto & i : libs) { ++ setSubstr(newDynStr, rdi(shdrDynStr.sh_size) + pos, i + '\0'); ++ libStrings.insert(rdi(shdrDynStr.sh_size) + pos); ++ pos += i.size() + 1; ++ } ++ ++ /* add all new needed entries to the dynamic section */ ++ std::string & newDynamic = replaceSection(".dynamic", ++ rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn) * libs.size()); ++ ++ unsigned int idx = 0; ++ for ( ; rdi(((Elf_Dyn *) newDynamic.c_str())[idx].d_tag) != DT_NULL; idx++) ; ++ debug("DT_NULL index is %d\n", idx); ++ ++ /* Shift all entries down by the number of new entries. */ ++ setSubstr(newDynamic, sizeof(Elf_Dyn) * libs.size(), ++ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1))); ++ ++ /* Add the DT_NEEDED entries at the top. */ ++ unsigned int i = 0; ++ for (auto & j : libStrings) { ++ Elf_Dyn newDyn; ++ wri(newDyn.d_tag, DT_NEEDED); ++ wri(newDyn.d_un.d_val, j); ++ setSubstr(newDynamic, i * sizeof(Elf_Dyn), std::string((char *) &newDyn, sizeof(Elf_Dyn))); ++ i++; ++ } ++ ++ changed = true; ++} ++ ++template ++void ElfFile::printNeededLibs() ++{ ++ Elf_Shdr & shdrDynamic = findSection(".dynamic"); ++ Elf_Shdr & shdrDynStr = findSection(".dynstr"); ++ char *strTab = (char *)contents + rdi(shdrDynStr.sh_offset); ++ ++ Elf_Dyn *dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ ++ for (; rdi(dyn->d_tag) != DT_NULL; dyn++) { ++ if (rdi(dyn->d_tag) == DT_NEEDED) { ++ char *name = strTab + rdi(dyn->d_un.d_val); ++ printf("%s\n", name); ++ } ++ } ++} ++ ++ ++template ++void ElfFile::noDefaultLib() ++{ ++ Elf_Shdr & shdrDynamic = findSection(".dynamic"); ++ ++ Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); ++ Elf_Dyn * dynFlags1 = 0; ++ for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) { ++ if (rdi(dyn->d_tag) == DT_FLAGS_1) { ++ dynFlags1 = dyn; ++ break; ++ } ++ } ++ if (dynFlags1) { ++ if (dynFlags1->d_un.d_val & DF_1_NODEFLIB) ++ return; ++ dynFlags1->d_un.d_val |= DF_1_NODEFLIB; ++ } else { ++ std::string & newDynamic = replaceSection(".dynamic", ++ rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn)); ++ ++ unsigned int idx = 0; ++ for ( ; rdi(((Elf_Dyn *) newDynamic.c_str())[idx].d_tag) != DT_NULL; idx++) ; ++ debug("DT_NULL index is %d\n", idx); ++ ++ /* Shift all entries down by one. */ ++ setSubstr(newDynamic, sizeof(Elf_Dyn), ++ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1))); ++ ++ /* Add the DT_FLAGS_1 entry at the top. */ ++ Elf_Dyn newDyn; ++ wri(newDyn.d_tag, DT_FLAGS_1); ++ newDyn.d_un.d_val = DF_1_NODEFLIB; ++ setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn))); ++ } ++ ++ changed = true; ++} ++ ++ ++static bool printInterpreter = false; ++static bool printSoname = false; ++static bool setSoname = false; ++static std::string newSoname; ++static std::string newInterpreter; + static bool shrinkRPath = false; ++static std::vector allowedRpathPrefixes; ++static bool removeRPath = false; + static bool setRPath = false; + static bool printRPath = false; +-static string newRPath; +-static set neededLibsToRemove; +- ++static std::string newRPath; ++static std::set neededLibsToRemove; ++static std::map neededLibsToReplace; ++static std::set neededLibsToAdd; ++static bool printNeeded = false; ++static bool noDefaultLib = false; + + template +-static void patchElf2(ElfFile & elfFile, mode_t fileMode) ++static void patchElf2(ElfFile && elfFile, std::string fileName) + { +- elfFile.parse(); +- + if (printInterpreter) + printf("%s\n", elfFile.getInterpreter().c_str()); + ++ if (printSoname) ++ elfFile.modifySoname(elfFile.printSoname, ""); ++ ++ if (setSoname) ++ elfFile.modifySoname(elfFile.replaceSoname, newSoname); ++ + if (newInterpreter != "") + elfFile.setInterpreter(newInterpreter); + + if (printRPath) +- elfFile.modifyRPath(elfFile.rpPrint, ""); ++ elfFile.modifyRPath(elfFile.rpPrint, {}, ""); + + if (shrinkRPath) +- elfFile.modifyRPath(elfFile.rpShrink, ""); ++ elfFile.modifyRPath(elfFile.rpShrink, allowedRpathPrefixes, ""); ++ else if (removeRPath) ++ elfFile.modifyRPath(elfFile.rpRemove, {}, ""); + else if (setRPath) +- elfFile.modifyRPath(elfFile.rpSet, newRPath); ++ elfFile.modifyRPath(elfFile.rpSet, {}, newRPath); ++ ++ if (printNeeded) elfFile.printNeededLibs(); + + elfFile.removeNeeded(neededLibsToRemove); ++ elfFile.replaceNeeded(neededLibsToReplace); ++ elfFile.addNeeded(neededLibsToAdd); ++ ++ if (noDefaultLib) ++ elfFile.noDefaultLib(); + + if (elfFile.isChanged()){ + elfFile.rewriteSections(); +- writeFile(fileName, fileMode); ++ writeFile(fileName, elfFile.fileContents); + } + } + + + static void patchElf() + { +- if (!printInterpreter && !printRPath) +- debug("patching ELF file `%s'\n", fileName.c_str()); +- +- mode_t fileMode; ++ for (auto fileName : fileNames) { ++ if (!printInterpreter && !printRPath && !printSoname && !printNeeded) ++ debug("patching ELF file '%s'\n", fileName.c_str()); + +- readFile(fileName, &fileMode); ++ debug("Kernel page size is %u bytes\n", getPageSize()); + ++ auto fileContents = readFile(fileName); + +- /* Check the ELF header for basic validity. */ +- if (fileSize < (off_t) sizeof(Elf32_Ehdr)) error("missing ELF header"); +- +- if (memcmp(contents, ELFMAG, SELFMAG) != 0) +- error("not an ELF executable"); +- +- if (contents[EI_CLASS] == ELFCLASS32 && +- contents[EI_VERSION] == EV_CURRENT) +- { +- ElfFile elfFile; +- patchElf2(elfFile, fileMode); +- } +- else if (contents[EI_CLASS] == ELFCLASS64 && +- contents[EI_VERSION] == EV_CURRENT) +- { +- ElfFile elfFile; +- patchElf2(elfFile, fileMode); +- } +- else { +- error("ELF executable is not 32/64-bit, little/big-endian, version 1"); ++ if (getElfType(fileContents).is32Bit) ++ patchElf2(ElfFile(fileContents), fileName); ++ else ++ patchElf2(ElfFile(fileContents), fileName); + } + } + + +-void showHelp(const string & progName) ++void showHelp(const std::string & progName) + { + fprintf(stderr, "syntax: %s\n\ + [--set-interpreter FILENAME]\n\ ++ [--page-size SIZE]\n\ + [--print-interpreter]\n\ ++ [--print-soname]\t\tPrints 'DT_SONAME' entry of .dynamic section. Raises an error if DT_SONAME doesn't exist\n\ ++ [--set-soname SONAME]\t\tSets 'DT_SONAME' entry to SONAME.\n\ + [--set-rpath RPATH]\n\ ++ [--remove-rpath]\n\ + [--shrink-rpath]\n\ ++ [--allowed-rpath-prefixes PREFIXES]\t\tWith '--shrink-rpath', reject rpath entries not starting with the allowed prefix\n\ + [--print-rpath]\n\ + [--force-rpath]\n\ ++ [--add-needed LIBRARY]\n\ + [--remove-needed LIBRARY]\n\ ++ [--replace-needed LIBRARY NEW_LIBRARY]\n\ ++ [--print-needed]\n\ ++ [--no-default-lib]\n\ + [--debug]\n\ + [--version]\n\ + FILENAME\n", progName.c_str()); + } + + +-int main(int argc, char * * argv) ++int mainWrapped(int argc, char * * argv) + { + if (argc <= 1) { + showHelp(argv[0]); +@@ -1179,17 +1660,37 @@ int main(int argc, char * * argv) + + int i; + for (i = 1; i < argc; ++i) { +- string arg(argv[i]); ++ std::string arg(argv[i]); + if (arg == "--set-interpreter" || arg == "--interpreter") { + if (++i == argc) error("missing argument"); + newInterpreter = argv[i]; + } ++ else if (arg == "--page-size") { ++ if (++i == argc) error("missing argument"); ++ pageSize = atoi(argv[i]); ++ if (pageSize <= 0) error("invalid argument to --page-size"); ++ } + else if (arg == "--print-interpreter") { + printInterpreter = true; + } ++ else if (arg == "--print-soname") { ++ printSoname = true; ++ } ++ else if (arg == "--set-soname") { ++ if (++i == argc) error("missing argument"); ++ setSoname = true; ++ newSoname = argv[i]; ++ } ++ else if (arg == "--remove-rpath") { ++ removeRPath = true; ++ } + else if (arg == "--shrink-rpath") { + shrinkRPath = true; + } ++ else if (arg == "--allowed-rpath-prefixes") { ++ if (++i == argc) error("missing argument"); ++ allowedRpathPrefixes = splitColonDelimitedString(argv[i]); ++ } + else if (arg == "--set-rpath") { + if (++i == argc) error("missing argument"); + setRPath = true; +@@ -1212,28 +1713,54 @@ int main(int argc, char * * argv) + added. */ + forceRPath = true; + } ++ else if (arg == "--print-needed") { ++ printNeeded = true; ++ } ++ else if (arg == "--add-needed") { ++ if (++i == argc) error("missing argument"); ++ neededLibsToAdd.insert(argv[i]); ++ } + else if (arg == "--remove-needed") { + if (++i == argc) error("missing argument"); + neededLibsToRemove.insert(argv[i]); + } ++ else if (arg == "--replace-needed") { ++ if (i+2 >= argc) error("missing argument(s)"); ++ neededLibsToReplace[ argv[i+1] ] = argv[i+2]; ++ i += 2; ++ } + else if (arg == "--debug") { + debugMode = true; + } +- else if (arg == "--help") { ++ else if (arg == "--no-default-lib") { ++ noDefaultLib = true; ++ } ++ else if (arg == "--help" || arg == "-h" ) { + showHelp(argv[0]); + return 0; + } + else if (arg == "--version") { +- printf("1.0\n"); ++ printf(PACKAGE_STRING "\n"); + return 0; + } +- else break; ++ else { ++ fileNames.push_back(arg); ++ } + } + +- if (i == argc) error("missing filename"); +- fileName = argv[i]; ++ if (fileNames.empty()) error("missing filename"); + + patchElf(); + + return 0; + } ++ ++int main(int argc, char * * argv) ++{ ++ try { ++ return mainWrapped(argc, argv); ++ } catch (std::exception & e) { ++ fprintf(stderr, "patchelf: %s\n", e.what()); ++ return 1; ++ } ++} +--- a/sources/patchelf/elf.h ++++ b/sources/patchelf/elf.h +@@ -1,6 +1,5 @@ + /* This file defines standard ELF types, structures, and macros. +- Copyright (C) 1995-2003,2004,2005,2006,2007,2008 +- Free Software Foundation, Inc. ++ Copyright (C) 1995-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -14,13 +13,16 @@ + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, write to the Free +- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +- 02111-1307 USA. */ ++ License along with the GNU C Library; if not, see ++ . */ + + #ifndef _ELF_H + #define _ELF_H 1 + ++/* #include */ ++ ++/* __BEGIN_DECLS */ ++ + /* Standard ELF types. */ + + #include +@@ -138,7 +140,8 @@ typedef struct + #define ELFOSABI_SYSV 0 /* Alias. */ + #define ELFOSABI_HPUX 1 /* HP-UX */ + #define ELFOSABI_NETBSD 2 /* NetBSD. */ +-#define ELFOSABI_LINUX 3 /* Linux. */ ++#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */ ++#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */ + #define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ + #define ELFOSABI_AIX 7 /* IBM AIX. */ + #define ELFOSABI_IRIX 8 /* SGI Irix. */ +@@ -146,6 +149,7 @@ typedef struct + #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ + #define ELFOSABI_MODESTO 11 /* Novell Modesto. */ + #define ELFOSABI_OPENBSD 12 /* OpenBSD. */ ++#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ + #define ELFOSABI_ARM 97 /* ARM */ + #define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ + +@@ -245,7 +249,11 @@ typedef struct + #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ + #define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ + #define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +-#define EM_NUM 95 ++#define EM_AARCH64 183 /* ARM AARCH64 */ ++#define EM_TILEPRO 188 /* Tilera TILEPro */ ++#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ ++#define EM_TILEGX 191 /* Tilera TILE-Gx */ ++#define EM_NUM 192 + + /* If it is necessary to assign new unofficial EM_* values, please + pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the +@@ -440,6 +448,7 @@ typedef struct + #define STB_WEAK 2 /* Weak symbol */ + #define STB_NUM 3 /* Number of defined types. */ + #define STB_LOOS 10 /* Start of OS-specific */ ++#define STB_GNU_UNIQUE 10 /* Unique symbol. */ + #define STB_HIOS 12 /* End of OS-specific */ + #define STB_LOPROC 13 /* Start of processor-specific */ + #define STB_HIPROC 15 /* End of processor-specific */ +@@ -455,6 +464,7 @@ typedef struct + #define STT_TLS 6 /* Symbol is thread-local data object*/ + #define STT_NUM 7 /* Number of defined types. */ + #define STT_LOOS 10 /* Start of OS-specific */ ++#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */ + #define STT_HIOS 12 /* End of OS-specific */ + #define STT_LOPROC 13 /* Start of processor-specific */ + #define STT_HIPROC 15 /* End of processor-specific */ +@@ -552,6 +562,12 @@ typedef struct + Elf64_Xword p_align; /* Segment alignment */ + } Elf64_Phdr; + ++/* Special value for e_phnum. This indicates that the real number of ++ program headers is too large to fit into e_phnum. Instead the real ++ value is in the field sh_info of section 0. */ ++ ++#define PN_XNUM 0xffff ++ + /* Legal values for p_type (segment type). */ + + #define PT_NULL 0 /* Program header table entry unused */ +@@ -601,10 +617,30 @@ typedef struct + #define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ + #define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ + #define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */ ++#define NT_SIGINFO 0x53494749 /* Contains copy of siginfo_t, ++ size might increase */ ++#define NT_FILE 0x46494c45 /* Contains information about mapped ++ files */ + #define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */ + #define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ + #define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ ++#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ + #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ ++#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ ++#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ ++#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ ++#define NT_S390_TIMER 0x301 /* s390 timer register */ ++#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */ ++#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */ ++#define NT_S390_CTRS 0x304 /* s390 control registers */ ++#define NT_S390_PREFIX 0x305 /* s390 prefix register */ ++#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ ++#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ ++#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ ++#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ ++#define NT_ARM_TLS 0x401 /* ARM TLS register */ ++#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ ++#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ + + /* Legal values for the note segment descriptor types for object files. */ + +@@ -768,6 +804,15 @@ typedef struct + #define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */ + #define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */ + #define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */ ++#define DF_1_NODIRECT 0x00020000 /* Object has no-direct binding. */ ++#define DF_1_IGNMULDEF 0x00040000 ++#define DF_1_NOKSYMS 0x00080000 ++#define DF_1_NOHDR 0x00100000 ++#define DF_1_EDITED 0x00200000 /* Object is modified after built. */ ++#define DF_1_NORELOC 0x00400000 ++#define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */ ++#define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */ ++#define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */ + + /* Flags for the feature selection in DT_FEATURE_1. */ + #define DTF_1_PARINIT 0x00000001 +@@ -927,59 +972,7 @@ typedef struct + } a_un; + } Elf64_auxv_t; + +-/* Legal values for a_type (entry type). */ +- +-#define AT_NULL 0 /* End of vector */ +-#define AT_IGNORE 1 /* Entry should be ignored */ +-#define AT_EXECFD 2 /* File descriptor of program */ +-#define AT_PHDR 3 /* Program headers for program */ +-#define AT_PHENT 4 /* Size of program header entry */ +-#define AT_PHNUM 5 /* Number of program headers */ +-#define AT_PAGESZ 6 /* System page size */ +-#define AT_BASE 7 /* Base address of interpreter */ +-#define AT_FLAGS 8 /* Flags */ +-#define AT_ENTRY 9 /* Entry point of program */ +-#define AT_NOTELF 10 /* Program is not ELF */ +-#define AT_UID 11 /* Real uid */ +-#define AT_EUID 12 /* Effective uid */ +-#define AT_GID 13 /* Real gid */ +-#define AT_EGID 14 /* Effective gid */ +-#define AT_CLKTCK 17 /* Frequency of times() */ +- +-/* Some more special a_type values describing the hardware. */ +-#define AT_PLATFORM 15 /* String identifying platform. */ +-#define AT_HWCAP 16 /* Machine dependent hints about +- processor capabilities. */ +- +-/* This entry gives some information about the FPU initialization +- performed by the kernel. */ +-#define AT_FPUCW 18 /* Used FPU control word. */ +- +-/* Cache block sizes. */ +-#define AT_DCACHEBSIZE 19 /* Data cache block size. */ +-#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */ +-#define AT_UCACHEBSIZE 21 /* Unified cache block size. */ +- +-/* A special ignored value for PPC, used by the kernel to control the +- interpretation of the AUXV. Must be > 16. */ +-#define AT_IGNOREPPC 22 /* Entry should be ignored. */ +- +-#define AT_SECURE 23 /* Boolean, was exec setuid-like? */ +- +-#define AT_EXECFN 31 /* Filename of executable. */ +- +-/* Pointer to the global system page used for system calls and other +- nice things. */ +-#define AT_SYSINFO 32 +-#define AT_SYSINFO_EHDR 33 +- +-/* Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains +- log2 of line size; mask those to get cache size. */ +-#define AT_L1I_CACHESHAPE 34 +-#define AT_L1D_CACHESHAPE 35 +-#define AT_L2_CACHESHAPE 36 +-#define AT_L3_CACHESHAPE 37 +- ++/* #include */ + /* Note section contents. Each entry in the note section begins with + a header of a fixed form. */ + +@@ -1042,6 +1035,9 @@ typedef struct + The descriptor consists of any nonzero number of bytes. */ + #define NT_GNU_BUILD_ID 3 + ++/* Version note generated by GNU gold containing a version string. */ ++#define NT_GNU_GOLD_VERSION 4 ++ + + /* Move records. */ + typedef struct +@@ -1102,8 +1098,29 @@ typedef struct + #define R_68K_GLOB_DAT 20 /* Create GOT entry */ + #define R_68K_JMP_SLOT 21 /* Create PLT entry */ + #define R_68K_RELATIVE 22 /* Adjust by program base */ ++#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */ ++#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */ ++#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */ ++#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */ ++#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */ ++#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */ ++#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */ ++#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */ ++#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */ ++#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */ ++#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */ ++#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */ ++#define R_68K_TLS_LE32 37 /* 32 bit offset relative to ++ static TLS block */ ++#define R_68K_TLS_LE16 38 /* 16 bit offset relative to ++ static TLS block */ ++#define R_68K_TLS_LE8 39 /* 8 bit offset relative to ++ static TLS block */ ++#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */ ++#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */ ++#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */ + /* Keep this the last entry. */ +-#define R_68K_NUM 23 ++#define R_68K_NUM 43 + + /* Intel 80386 specific definitions. */ + +@@ -1157,7 +1174,7 @@ typedef struct + #define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */ + #define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */ + #define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */ +-/* 38? */ ++#define R_386_SIZE32 38 /* 32-bit symbol size */ + #define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */ + #define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS + descriptor for +@@ -1166,8 +1183,9 @@ typedef struct + pointer to code and to + argument, returning the TLS + offset for the symbol. */ ++#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ + /* Keep this the last entry. */ +-#define R_386_NUM 42 ++#define R_386_NUM 43 + + /* SUN SPARC specific definitions. */ + +@@ -1235,6 +1253,7 @@ typedef struct + #define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ + #define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ + #define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ ++#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */ + #define R_SPARC_7 43 /* Direct 7 bit */ + #define R_SPARC_5 44 /* Direct 5 bit */ + #define R_SPARC_6 45 /* Direct 6 bit */ +@@ -1272,118 +1291,124 @@ typedef struct + #define R_SPARC_TLS_DTPOFF64 77 + #define R_SPARC_TLS_TPOFF32 78 + #define R_SPARC_TLS_TPOFF64 79 ++#define R_SPARC_GOTDATA_HIX22 80 ++#define R_SPARC_GOTDATA_LOX10 81 ++#define R_SPARC_GOTDATA_OP_HIX22 82 ++#define R_SPARC_GOTDATA_OP_LOX10 83 ++#define R_SPARC_GOTDATA_OP 84 ++#define R_SPARC_H34 85 ++#define R_SPARC_SIZE32 86 ++#define R_SPARC_SIZE64 87 ++#define R_SPARC_WDISP10 88 ++#define R_SPARC_JMP_IREL 248 ++#define R_SPARC_IRELATIVE 249 ++#define R_SPARC_GNU_VTINHERIT 250 ++#define R_SPARC_GNU_VTENTRY 251 ++#define R_SPARC_REV32 252 + /* Keep this the last entry. */ +-#define R_SPARC_NUM 80 ++#define R_SPARC_NUM 253 + + /* For Sparc64, legal values for d_tag of Elf64_Dyn. */ + +-#define DT_SPARC_REGISTER 0x70000001 +-#define DT_SPARC_NUM 2 +- +-/* Bits present in AT_HWCAP on SPARC. */ +- +-#define HWCAP_SPARC_FLUSH 1 /* The CPU supports flush insn. */ +-#define HWCAP_SPARC_STBAR 2 +-#define HWCAP_SPARC_SWAP 4 +-#define HWCAP_SPARC_MULDIV 8 +-#define HWCAP_SPARC_V9 16 /* The CPU is v9, so v8plus is ok. */ +-#define HWCAP_SPARC_ULTRA3 32 +-#define HWCAP_SPARC_BLKINIT 64 /* Sun4v with block-init/load-twin. */ +-#define HWCAP_SPARC_N2 128 ++#define DT_SPARC_REGISTER 0x70000001 ++#define DT_SPARC_NUM 2 + + /* MIPS R3000 specific definitions. */ + + /* Legal values for e_flags field of Elf32_Ehdr. */ + +-#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */ +-#define EF_MIPS_PIC 2 /* Contains PIC code */ +-#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */ +-#define EF_MIPS_XGOT 8 +-#define EF_MIPS_64BIT_WHIRL 16 +-#define EF_MIPS_ABI2 32 +-#define EF_MIPS_ABI_ON32 64 +-#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */ ++#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used. */ ++#define EF_MIPS_PIC 2 /* Contains PIC code. */ ++#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence. */ ++#define EF_MIPS_XGOT 8 ++#define EF_MIPS_64BIT_WHIRL 16 ++#define EF_MIPS_ABI2 32 ++#define EF_MIPS_ABI_ON32 64 ++#define EF_MIPS_NAN2008 1024 /* Uses IEEE 754-2008 NaN encoding. */ ++#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level. */ + + /* Legal values for MIPS architecture level. */ + +-#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ +-#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ +-#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ +-#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ +-#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ +-#define EF_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ +-#define EF_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ +- +-/* The following are non-official names and should not be used. */ +- +-#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ +-#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ +-#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ +-#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ +-#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ +-#define E_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ +-#define E_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ ++#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ ++#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ ++#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ ++#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ ++#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ ++#define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */ ++#define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */ ++#define EF_MIPS_ARCH_32R2 0x70000000 /* MIPS32r2 code. */ ++#define EF_MIPS_ARCH_64R2 0x80000000 /* MIPS64r2 code. */ ++ ++/* The following are unofficial names and should not be used. */ ++ ++#define E_MIPS_ARCH_1 EF_MIPS_ARCH_1 ++#define E_MIPS_ARCH_2 EF_MIPS_ARCH_2 ++#define E_MIPS_ARCH_3 EF_MIPS_ARCH_3 ++#define E_MIPS_ARCH_4 EF_MIPS_ARCH_4 ++#define E_MIPS_ARCH_5 EF_MIPS_ARCH_5 ++#define E_MIPS_ARCH_32 EF_MIPS_ARCH_32 ++#define E_MIPS_ARCH_64 EF_MIPS_ARCH_64 + + /* Special section indices. */ + +-#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */ +-#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ +-#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ +-#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */ +-#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */ ++#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols. */ ++#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ ++#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ ++#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols. */ ++#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols. */ + + /* Legal values for sh_type field of Elf32_Shdr. */ + +-#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */ +-#define SHT_MIPS_MSYM 0x70000001 +-#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */ +-#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */ +-#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ +-#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/ +-#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */ +-#define SHT_MIPS_PACKAGE 0x70000007 +-#define SHT_MIPS_PACKSYM 0x70000008 +-#define SHT_MIPS_RELD 0x70000009 +-#define SHT_MIPS_IFACE 0x7000000b +-#define SHT_MIPS_CONTENT 0x7000000c +-#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ +-#define SHT_MIPS_SHDR 0x70000010 +-#define SHT_MIPS_FDESC 0x70000011 +-#define SHT_MIPS_EXTSYM 0x70000012 +-#define SHT_MIPS_DENSE 0x70000013 +-#define SHT_MIPS_PDESC 0x70000014 +-#define SHT_MIPS_LOCSYM 0x70000015 +-#define SHT_MIPS_AUXSYM 0x70000016 +-#define SHT_MIPS_OPTSYM 0x70000017 +-#define SHT_MIPS_LOCSTR 0x70000018 +-#define SHT_MIPS_LINE 0x70000019 +-#define SHT_MIPS_RFDESC 0x7000001a +-#define SHT_MIPS_DELTASYM 0x7000001b +-#define SHT_MIPS_DELTAINST 0x7000001c +-#define SHT_MIPS_DELTACLASS 0x7000001d +-#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ +-#define SHT_MIPS_DELTADECL 0x7000001f +-#define SHT_MIPS_SYMBOL_LIB 0x70000020 +-#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ +-#define SHT_MIPS_TRANSLATE 0x70000022 +-#define SHT_MIPS_PIXIE 0x70000023 +-#define SHT_MIPS_XLATE 0x70000024 +-#define SHT_MIPS_XLATE_DEBUG 0x70000025 +-#define SHT_MIPS_WHIRL 0x70000026 +-#define SHT_MIPS_EH_REGION 0x70000027 +-#define SHT_MIPS_XLATE_OLD 0x70000028 +-#define SHT_MIPS_PDR_EXCEPTION 0x70000029 ++#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link. */ ++#define SHT_MIPS_MSYM 0x70000001 ++#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols. */ ++#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes. */ ++#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ ++#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging info. */ ++#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information. */ ++#define SHT_MIPS_PACKAGE 0x70000007 ++#define SHT_MIPS_PACKSYM 0x70000008 ++#define SHT_MIPS_RELD 0x70000009 ++#define SHT_MIPS_IFACE 0x7000000b ++#define SHT_MIPS_CONTENT 0x7000000c ++#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ ++#define SHT_MIPS_SHDR 0x70000010 ++#define SHT_MIPS_FDESC 0x70000011 ++#define SHT_MIPS_EXTSYM 0x70000012 ++#define SHT_MIPS_DENSE 0x70000013 ++#define SHT_MIPS_PDESC 0x70000014 ++#define SHT_MIPS_LOCSYM 0x70000015 ++#define SHT_MIPS_AUXSYM 0x70000016 ++#define SHT_MIPS_OPTSYM 0x70000017 ++#define SHT_MIPS_LOCSTR 0x70000018 ++#define SHT_MIPS_LINE 0x70000019 ++#define SHT_MIPS_RFDESC 0x7000001a ++#define SHT_MIPS_DELTASYM 0x7000001b ++#define SHT_MIPS_DELTAINST 0x7000001c ++#define SHT_MIPS_DELTACLASS 0x7000001d ++#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ ++#define SHT_MIPS_DELTADECL 0x7000001f ++#define SHT_MIPS_SYMBOL_LIB 0x70000020 ++#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ ++#define SHT_MIPS_TRANSLATE 0x70000022 ++#define SHT_MIPS_PIXIE 0x70000023 ++#define SHT_MIPS_XLATE 0x70000024 ++#define SHT_MIPS_XLATE_DEBUG 0x70000025 ++#define SHT_MIPS_WHIRL 0x70000026 ++#define SHT_MIPS_EH_REGION 0x70000027 ++#define SHT_MIPS_XLATE_OLD 0x70000028 ++#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + /* Legal values for sh_flags field of Elf32_Shdr. */ + +-#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */ +-#define SHF_MIPS_MERGE 0x20000000 +-#define SHF_MIPS_ADDR 0x40000000 +-#define SHF_MIPS_STRINGS 0x80000000 +-#define SHF_MIPS_NOSTRIP 0x08000000 +-#define SHF_MIPS_LOCAL 0x04000000 +-#define SHF_MIPS_NAMES 0x02000000 +-#define SHF_MIPS_NODUPE 0x01000000 ++#define SHF_MIPS_GPREL 0x10000000 /* Must be in global data area. */ ++#define SHF_MIPS_MERGE 0x20000000 ++#define SHF_MIPS_ADDR 0x40000000 ++#define SHF_MIPS_STRINGS 0x80000000 ++#define SHF_MIPS_NOSTRIP 0x08000000 ++#define SHF_MIPS_LOCAL 0x04000000 ++#define SHF_MIPS_NAMES 0x02000000 ++#define SHF_MIPS_NODUPE 0x01000000 + + + /* Symbol tables. */ +@@ -1405,23 +1430,23 @@ typedef union + { + struct + { +- Elf32_Word gt_current_g_value; /* -G value used for compilation */ +- Elf32_Word gt_unused; /* Not used */ +- } gt_header; /* First entry in section */ ++ Elf32_Word gt_current_g_value; /* -G value used for compilation. */ ++ Elf32_Word gt_unused; /* Not used. */ ++ } gt_header; /* First entry in section. */ + struct + { +- Elf32_Word gt_g_value; /* If this value were used for -G */ +- Elf32_Word gt_bytes; /* This many bytes would be used */ +- } gt_entry; /* Subsequent entries in section */ ++ Elf32_Word gt_g_value; /* If this value were used for -G. */ ++ Elf32_Word gt_bytes; /* This many bytes would be used. */ ++ } gt_entry; /* Subsequent entries in section. */ + } Elf32_gptab; + + /* Entry found in sections of type SHT_MIPS_REGINFO. */ + + typedef struct + { +- Elf32_Word ri_gprmask; /* General registers used */ +- Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */ +- Elf32_Sword ri_gp_value; /* $gp register value */ ++ Elf32_Word ri_gprmask; /* General registers used. */ ++ Elf32_Word ri_cprmask[4]; /* Coprocessor registers used. */ ++ Elf32_Sword ri_gp_value; /* $gp register value. */ + } Elf32_RegInfo; + + /* Entries found in sections of type SHT_MIPS_OPTIONS. */ +@@ -2013,9 +2038,6 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ + #define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ + +-/* Keep this the last entry. */ +-#define R_PPC_NUM 95 +- + /* The remaining relocs are from the Embedded ELF ABI, and are not + in the SVR4 ELF ABI. */ + #define R_PPC_EMB_NADDR32 101 +@@ -2043,11 +2065,14 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ + #define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ + ++/* GNU extension to support local ifunc. */ ++#define R_PPC_IRELATIVE 248 ++ + /* GNU relocs used in PIC code sequences. */ +-#define R_PPC_REL16 249 /* word32 (sym-.) */ +-#define R_PPC_REL16_LO 250 /* half16 (sym-.)@l */ +-#define R_PPC_REL16_HI 251 /* half16 (sym-.)@h */ +-#define R_PPC_REL16_HA 252 /* half16 (sym-.)@ha */ ++#define R_PPC_REL16 249 /* half16 (sym+add-.) */ ++#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */ ++#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */ ++#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */ + + /* This is a phony reloc to handle any old fashioned TOC16 references + that may still be in object files. */ +@@ -2168,76 +2193,261 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ + #define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ + #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ +- +-/* Keep this the last entry. */ +-#define R_PPC64_NUM 107 ++#define R_PPC64_TLSGD 107 /* none (sym+add)@tlsgd */ ++#define R_PPC64_TLSLD 108 /* none (sym+add)@tlsld */ ++#define R_PPC64_TOCSAVE 109 /* none */ ++ ++/* Added when HA and HI relocs were changed to report overflows. */ ++#define R_PPC64_ADDR16_HIGH 110 ++#define R_PPC64_ADDR16_HIGHA 111 ++#define R_PPC64_TPREL16_HIGH 112 ++#define R_PPC64_TPREL16_HIGHA 113 ++#define R_PPC64_DTPREL16_HIGH 114 ++#define R_PPC64_DTPREL16_HIGHA 115 ++ ++/* GNU extension to support local ifunc. */ ++#define R_PPC64_JMP_IREL 247 ++#define R_PPC64_IRELATIVE 248 ++#define R_PPC64_REL16 249 /* half16 (sym+add-.) */ ++#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */ ++#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */ ++#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */ ++ ++/* e_flags bits specifying ABI. ++ 1 for original function descriptor using ABI, ++ 2 for revised ABI without function descriptors, ++ 0 for unspecified or not using any features affected by the differences. */ ++#define EF_PPC64_ABI 3 + + /* PowerPC64 specific values for the Dyn d_tag field. */ + #define DT_PPC64_GLINK (DT_LOPROC + 0) + #define DT_PPC64_OPD (DT_LOPROC + 1) + #define DT_PPC64_OPDSZ (DT_LOPROC + 2) ++#define DT_PPC64_OPT (DT_LOPROC + 3) + #define DT_PPC64_NUM 3 + ++/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ ++#define PPC64_OPT_TLS 1 ++#define PPC64_OPT_MULTI_TOC 2 ++ ++/* PowerPC64 specific values for the Elf64_Sym st_other field. */ ++#define STO_PPC64_LOCAL_BIT 5 ++#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) ++#define PPC64_LOCAL_ENTRY_OFFSET(other) \ ++ (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2) ++ + + /* ARM specific declarations */ + + /* Processor specific flags for the ELF header e_flags field. */ +-#define EF_ARM_RELEXEC 0x01 +-#define EF_ARM_HASENTRY 0x02 +-#define EF_ARM_INTERWORK 0x04 +-#define EF_ARM_APCS_26 0x08 +-#define EF_ARM_APCS_FLOAT 0x10 +-#define EF_ARM_PIC 0x20 +-#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */ +-#define EF_ARM_NEW_ABI 0x80 +-#define EF_ARM_OLD_ABI 0x100 ++#define EF_ARM_RELEXEC 0x01 ++#define EF_ARM_HASENTRY 0x02 ++#define EF_ARM_INTERWORK 0x04 ++#define EF_ARM_APCS_26 0x08 ++#define EF_ARM_APCS_FLOAT 0x10 ++#define EF_ARM_PIC 0x20 ++#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */ ++#define EF_ARM_NEW_ABI 0x80 ++#define EF_ARM_OLD_ABI 0x100 ++#define EF_ARM_SOFT_FLOAT 0x200 ++#define EF_ARM_VFP_FLOAT 0x400 ++#define EF_ARM_MAVERICK_FLOAT 0x800 ++ ++#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT */ ++#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT */ ++ + + /* Other constants defined in the ARM ELF spec. version B-01. */ + /* NB. These conflict with values defined above. */ + #define EF_ARM_SYMSARESORTED 0x04 +-#define EF_ARM_DYNSYMSUSESEGIDX 0x08 ++#define EF_ARM_DYNSYMSUSESEGIDX 0x08 + #define EF_ARM_MAPSYMSFIRST 0x10 + #define EF_ARM_EABIMASK 0XFF000000 + +-#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +-#define EF_ARM_EABI_UNKNOWN 0x00000000 +-#define EF_ARM_EABI_VER1 0x01000000 +-#define EF_ARM_EABI_VER2 0x02000000 +- +-/* Additional symbol types for Thumb */ +-#define STT_ARM_TFUNC 0xd ++/* Constants defined in AAELF. */ ++#define EF_ARM_BE8 0x00800000 ++#define EF_ARM_LE8 0x00400000 ++ ++#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) ++#define EF_ARM_EABI_UNKNOWN 0x00000000 ++#define EF_ARM_EABI_VER1 0x01000000 ++#define EF_ARM_EABI_VER2 0x02000000 ++#define EF_ARM_EABI_VER3 0x03000000 ++#define EF_ARM_EABI_VER4 0x04000000 ++#define EF_ARM_EABI_VER5 0x05000000 ++ ++/* Additional symbol types for Thumb. */ ++#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ ++#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ + + /* ARM-specific values for sh_flags */ +-#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ +-#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined +- in the input to a link step */ ++#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ ++#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined ++ in the input to a link step. */ + + /* ARM-specific program header flags */ +-#define PF_ARM_SB 0x10000000 /* Segment contains the location +- addressed by the static base */ ++#define PF_ARM_SB 0x10000000 /* Segment contains the location ++ addressed by the static base. */ ++#define PF_ARM_PI 0x20000000 /* Position-independent segment. */ ++#define PF_ARM_ABS 0x40000000 /* Absolute segment. */ + + /* Processor specific values for the Phdr p_type field. */ +-#define PT_ARM_EXIDX 0x70000001 /* .ARM.exidx segment */ ++#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */ ++ ++/* Processor specific values for the Shdr sh_type field. */ ++#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */ ++#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */ ++#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ ++ ++ ++/* AArch64 relocs. */ ++ ++#define R_AARCH64_NONE 0 /* No relocation. */ ++#define R_AARCH64_ABS64 257 /* Direct 64 bit. */ ++#define R_AARCH64_ABS32 258 /* Direct 32 bit. */ ++#define R_AARCH64_ABS16 259 /* Direct 16-bit. */ ++#define R_AARCH64_PREL64 260 /* PC-relative 64-bit. */ ++#define R_AARCH64_PREL32 261 /* PC-relative 32-bit. */ ++#define R_AARCH64_PREL16 262 /* PC-relative 16-bit. */ ++#define R_AARCH64_MOVW_UABS_G0 263 /* Dir. MOVZ imm. from bits 15:0. */ ++#define R_AARCH64_MOVW_UABS_G0_NC 264 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G1 265 /* Dir. MOVZ imm. from bits 31:16. */ ++#define R_AARCH64_MOVW_UABS_G1_NC 266 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G2 267 /* Dir. MOVZ imm. from bits 47:32. */ ++#define R_AARCH64_MOVW_UABS_G2_NC 268 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G3 269 /* Dir. MOV{K,Z} imm. from 63:48. */ ++#define R_AARCH64_MOVW_SABS_G0 270 /* Dir. MOV{N,Z} imm. from 15:0. */ ++#define R_AARCH64_MOVW_SABS_G1 271 /* Dir. MOV{N,Z} imm. from 31:16. */ ++#define R_AARCH64_MOVW_SABS_G2 272 /* Dir. MOV{N,Z} imm. from 47:32. */ ++#define R_AARCH64_LD_PREL_LO19 273 /* PC-rel. LD imm. from bits 20:2. */ ++#define R_AARCH64_ADR_PREL_LO21 274 /* PC-rel. ADR imm. from bits 20:0. */ ++#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12. */ ++#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check. */ ++#define R_AARCH64_ADD_ABS_LO12_NC 277 /* Dir. ADD imm. from bits 11:0. */ ++#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* Likewise for LD/ST; no check. */ ++#define R_AARCH64_TSTBR14 279 /* PC-rel. TBZ/TBNZ imm. from 15:2. */ ++#define R_AARCH64_CONDBR19 280 /* PC-rel. cond. br. imm. from 20:2. */ ++#define R_AARCH64_JUMP26 282 /* PC-rel. B imm. from bits 27:2. */ ++#define R_AARCH64_CALL26 283 /* Likewise for CALL. */ ++#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1. */ ++#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2. */ ++#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3. */ ++#define R_AARCH64_MOVW_PREL_G0 287 /* PC-rel. MOV{N,Z} imm. from 15:0. */ ++#define R_AARCH64_MOVW_PREL_G0_NC 288 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G1 289 /* PC-rel. MOV{N,Z} imm. from 31:16. */ ++#define R_AARCH64_MOVW_PREL_G1_NC 290 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G2 291 /* PC-rel. MOV{N,Z} imm. from 47:32. */ ++#define R_AARCH64_MOVW_PREL_G2_NC 292 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G3 293 /* PC-rel. MOV{N,Z} imm. from 63:48. */ ++#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4. */ ++#define R_AARCH64_MOVW_GOTOFF_G0 300 /* GOT-rel. off. MOV{N,Z} imm. 15:0. */ ++#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G1 302 /* GOT-rel. o. MOV{N,Z} imm. 31:16. */ ++#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G2 304 /* GOT-rel. o. MOV{N,Z} imm. 47:32. */ ++#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G3 306 /* GOT-rel. o. MOV{N,Z} imm. 63:48. */ ++#define R_AARCH64_GOTREL64 307 /* GOT-relative 64-bit. */ ++#define R_AARCH64_GOTREL32 308 /* GOT-relative 32-bit. */ ++#define R_AARCH64_GOT_LD_PREL19 309 /* PC-rel. GOT off. load imm. 20:2. */ ++#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3. */ ++#define R_AARCH64_ADR_GOT_PAGE 311 /* P-page-rel. GOT off. ADRP 32:12. */ ++#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3. */ ++#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* GOT-page-rel. GOT off. LD/ST 14:3 */ ++#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0. */ ++#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12. */ ++#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* direct ADD imm. from 11:0. */ ++#define R_AARCH64_TLSGD_MOVW_G1 515 /* GOT-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0. */ ++#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model. */ ++#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model. */ ++#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* Like 514; local dynamic model. */ ++#define R_AARCH64_TLSLD_MOVW_G1 520 /* Like 515; local dynamic model. */ ++#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model. */ ++#define R_AARCH64_TLSLD_LD_PREL19 522 /* TLS PC-rel. load imm. 20:2. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0. */ ++#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1. */ ++#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2. */ ++#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3. */ ++#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check. */ ++#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0. */ ++#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12. */ ++#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3. */ ++#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0. */ ++#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1. */ ++#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check. */ ++#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2. */ ++#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check. */ ++#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3. */ ++#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check. */ ++#define R_AARCH64_TLSDESC_LD_PREL19 560 /* PC-rel. load immediate 20:2. */ ++#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0. */ ++#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12. */ ++#define R_AARCH64_TLSDESC_LD64_LO12 563 /* Direct LD off. from 11:3. */ ++#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0. */ ++#define R_AARCH64_TLSDESC_OFF_G1 565 /* GOT-rel. MOV{N,Z} imm. 31:16. */ ++#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* GOT-rel. MOVK imm. 15:0; no ck. */ ++#define R_AARCH64_TLSDESC_LDR 567 /* Relax LDR. */ ++#define R_AARCH64_TLSDESC_ADD 568 /* Relax ADD. */ ++#define R_AARCH64_TLSDESC_CALL 569 /* Relax BLR. */ ++#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4. */ ++#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */ ++#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check. */ ++#define R_AARCH64_COPY 1024 /* Copy symbol at runtime. */ ++#define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */ ++#define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */ ++#define R_AARCH64_RELATIVE 1027 /* Adjust by program base. */ ++#define R_AARCH64_TLS_DTPMOD64 1028 /* Module number, 64 bit. */ ++#define R_AARCH64_TLS_DTPREL64 1029 /* Module-relative offset, 64 bit. */ ++#define R_AARCH64_TLS_TPREL64 1030 /* TP-relative offset, 64 bit. */ ++#define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */ ++#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ + + /* ARM relocs. */ + + #define R_ARM_NONE 0 /* No reloc */ +-#define R_ARM_PC24 1 /* PC relative 26 bit branch */ ++#define R_ARM_PC24 1 /* Deprecated PC relative 26 ++ bit branch. */ + #define R_ARM_ABS32 2 /* Direct 32 bit */ + #define R_ARM_REL32 3 /* PC relative 32 bit */ + #define R_ARM_PC13 4 + #define R_ARM_ABS16 5 /* Direct 16 bit */ + #define R_ARM_ABS12 6 /* Direct 12 bit */ +-#define R_ARM_THM_ABS5 7 ++#define R_ARM_THM_ABS5 7 /* Direct & 0x7C (LDR, STR). */ + #define R_ARM_ABS8 8 /* Direct 8 bit */ + #define R_ARM_SBREL32 9 +-#define R_ARM_THM_PC22 10 +-#define R_ARM_THM_PC8 11 ++#define R_ARM_THM_PC22 10 /* PC relative 24 bit (Thumb32 BL). */ ++#define R_ARM_THM_PC8 11 /* PC relative & 0x3FC ++ (Thumb16 LDR, ADD, ADR). */ + #define R_ARM_AMP_VCALL9 12 +-#define R_ARM_SWI24 13 +-#define R_ARM_THM_SWI8 14 +-#define R_ARM_XPC25 15 +-#define R_ARM_THM_XPC22 16 ++#define R_ARM_SWI24 13 /* Obsolete static relocation. */ ++#define R_ARM_TLS_DESC 13 /* Dynamic relocation. */ ++#define R_ARM_THM_SWI8 14 /* Reserved. */ ++#define R_ARM_XPC25 15 /* Reserved. */ ++#define R_ARM_THM_XPC22 16 /* Reserved. */ + #define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */ + #define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */ + #define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */ +@@ -2248,17 +2458,109 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ + #define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ + #define R_ARM_GOT32 26 /* 32 bit GOT entry */ +-#define R_ARM_PLT32 27 /* 32 bit PLT address */ +-#define R_ARM_ALU_PCREL_7_0 32 +-#define R_ARM_ALU_PCREL_15_8 33 +-#define R_ARM_ALU_PCREL_23_15 34 +-#define R_ARM_LDR_SBREL_11_0 35 +-#define R_ARM_ALU_SBREL_19_12 36 +-#define R_ARM_ALU_SBREL_27_20 37 ++#define R_ARM_PLT32 27 /* Deprecated, 32 bit PLT address. */ ++#define R_ARM_CALL 28 /* PC relative 24 bit (BL, BLX). */ ++#define R_ARM_JUMP24 29 /* PC relative 24 bit ++ (B, BL). */ ++#define R_ARM_THM_JUMP24 30 /* PC relative 24 bit (Thumb32 B.W). */ ++#define R_ARM_BASE_ABS 31 /* Adjust by program base. */ ++#define R_ARM_ALU_PCREL_7_0 32 /* Obsolete. */ ++#define R_ARM_ALU_PCREL_15_8 33 /* Obsolete. */ ++#define R_ARM_ALU_PCREL_23_15 34 /* Obsolete. */ ++#define R_ARM_LDR_SBREL_11_0 35 /* Deprecated, prog. base relative. */ ++#define R_ARM_ALU_SBREL_19_12 36 /* Deprecated, prog. base relative. */ ++#define R_ARM_ALU_SBREL_27_20 37 /* Deprecated, prog. base relative. */ ++#define R_ARM_TARGET1 38 ++#define R_ARM_SBREL31 39 /* Program base relative. */ ++#define R_ARM_V4BX 40 ++#define R_ARM_TARGET2 41 ++#define R_ARM_PREL31 42 /* 32 bit PC relative. */ ++#define R_ARM_MOVW_ABS_NC 43 /* Direct 16-bit (MOVW). */ ++#define R_ARM_MOVT_ABS 44 /* Direct high 16-bit (MOVT). */ ++#define R_ARM_MOVW_PREL_NC 45 /* PC relative 16-bit (MOVW). */ ++#define R_ARM_MOVT_PREL 46 /* PC relative (MOVT). */ ++#define R_ARM_THM_MOVW_ABS_NC 47 /* Direct 16 bit (Thumb32 MOVW). */ ++#define R_ARM_THM_MOVT_ABS 48 /* Direct high 16 bit ++ (Thumb32 MOVT). */ ++#define R_ARM_THM_MOVW_PREL_NC 49 /* PC relative 16 bit ++ (Thumb32 MOVW). */ ++#define R_ARM_THM_MOVT_PREL 50 /* PC relative high 16 bit ++ (Thumb32 MOVT). */ ++#define R_ARM_THM_JUMP19 51 /* PC relative 20 bit ++ (Thumb32 B.W). */ ++#define R_ARM_THM_JUMP6 52 /* PC relative X & 0x7E ++ (Thumb16 CBZ, CBNZ). */ ++#define R_ARM_THM_ALU_PREL_11_0 53 /* PC relative 12 bit ++ (Thumb32 ADR.W). */ ++#define R_ARM_THM_PC12 54 /* PC relative 12 bit ++ (Thumb32 LDR{D,SB,H,SH}). */ ++#define R_ARM_ABS32_NOI 55 /* Direct 32-bit. */ ++#define R_ARM_REL32_NOI 56 /* PC relative 32-bit. */ ++#define R_ARM_ALU_PC_G0_NC 57 /* PC relative (ADD, SUB). */ ++#define R_ARM_ALU_PC_G0 58 /* PC relative (ADD, SUB). */ ++#define R_ARM_ALU_PC_G1_NC 59 /* PC relative (ADD, SUB). */ ++#define R_ARM_ALU_PC_G1 60 /* PC relative (ADD, SUB). */ ++#define R_ARM_ALU_PC_G2 61 /* PC relative (ADD, SUB). */ ++#define R_ARM_LDR_PC_G1 62 /* PC relative (LDR,STR,LDRB,STRB). */ ++#define R_ARM_LDR_PC_G2 63 /* PC relative (LDR,STR,LDRB,STRB). */ ++#define R_ARM_LDRS_PC_G0 64 /* PC relative (STR{D,H}, ++ LDR{D,SB,H,SH}). */ ++#define R_ARM_LDRS_PC_G1 65 /* PC relative (STR{D,H}, ++ LDR{D,SB,H,SH}). */ ++#define R_ARM_LDRS_PC_G2 66 /* PC relative (STR{D,H}, ++ LDR{D,SB,H,SH}). */ ++#define R_ARM_LDC_PC_G0 67 /* PC relative (LDC, STC). */ ++#define R_ARM_LDC_PC_G1 68 /* PC relative (LDC, STC). */ ++#define R_ARM_LDC_PC_G2 69 /* PC relative (LDC, STC). */ ++#define R_ARM_ALU_SB_G0_NC 70 /* Program base relative (ADD,SUB). */ ++#define R_ARM_ALU_SB_G0 71 /* Program base relative (ADD,SUB). */ ++#define R_ARM_ALU_SB_G1_NC 72 /* Program base relative (ADD,SUB). */ ++#define R_ARM_ALU_SB_G1 73 /* Program base relative (ADD,SUB). */ ++#define R_ARM_ALU_SB_G2 74 /* Program base relative (ADD,SUB). */ ++#define R_ARM_LDR_SB_G0 75 /* Program base relative (LDR, ++ STR, LDRB, STRB). */ ++#define R_ARM_LDR_SB_G1 76 /* Program base relative ++ (LDR, STR, LDRB, STRB). */ ++#define R_ARM_LDR_SB_G2 77 /* Program base relative ++ (LDR, STR, LDRB, STRB). */ ++#define R_ARM_LDRS_SB_G0 78 /* Program base relative ++ (LDR, STR, LDRB, STRB). */ ++#define R_ARM_LDRS_SB_G1 79 /* Program base relative ++ (LDR, STR, LDRB, STRB). */ ++#define R_ARM_LDRS_SB_G2 80 /* Program base relative ++ (LDR, STR, LDRB, STRB). */ ++#define R_ARM_LDC_SB_G0 81 /* Program base relative (LDC,STC). */ ++#define R_ARM_LDC_SB_G1 82 /* Program base relative (LDC,STC). */ ++#define R_ARM_LDC_SB_G2 83 /* Program base relative (LDC,STC). */ ++#define R_ARM_MOVW_BREL_NC 84 /* Program base relative 16 ++ bit (MOVW). */ ++#define R_ARM_MOVT_BREL 85 /* Program base relative high ++ 16 bit (MOVT). */ ++#define R_ARM_MOVW_BREL 86 /* Program base relative 16 ++ bit (MOVW). */ ++#define R_ARM_THM_MOVW_BREL_NC 87 /* Program base relative 16 ++ bit (Thumb32 MOVW). */ ++#define R_ARM_THM_MOVT_BREL 88 /* Program base relative high ++ 16 bit (Thumb32 MOVT). */ ++#define R_ARM_THM_MOVW_BREL 89 /* Program base relative 16 ++ bit (Thumb32 MOVW). */ ++#define R_ARM_TLS_GOTDESC 90 ++#define R_ARM_TLS_CALL 91 ++#define R_ARM_TLS_DESCSEQ 92 /* TLS relaxation. */ ++#define R_ARM_THM_TLS_CALL 93 ++#define R_ARM_PLT32_ABS 94 ++#define R_ARM_GOT_ABS 95 /* GOT entry. */ ++#define R_ARM_GOT_PREL 96 /* PC relative GOT entry. */ ++#define R_ARM_GOT_BREL12 97 /* GOT entry relative to GOT ++ origin (LDR). */ ++#define R_ARM_GOTOFF12 98 /* 12 bit, GOT entry relative ++ to GOT origin (LDR, STR). */ ++#define R_ARM_GOTRELAX 99 + #define R_ARM_GNU_VTENTRY 100 + #define R_ARM_GNU_VTINHERIT 101 +-#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ +-#define R_ARM_THM_PC9 103 /* thumb conditional branch */ ++#define R_ARM_THM_PC11 102 /* PC relative & 0xFFE (Thumb16 B). */ ++#define R_ARM_THM_PC9 103 /* PC relative & 0x1FE ++ (Thumb16 B/B). */ + #define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic + thread local data */ + #define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic +@@ -2269,6 +2571,19 @@ typedef Elf32_Addr Elf32_Conflict; + static TLS block offset */ + #define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static + TLS block */ ++#define R_ARM_TLS_LDO12 109 /* 12 bit relative to TLS ++ block (LDR, STR). */ ++#define R_ARM_TLS_LE12 110 /* 12 bit relative to static ++ TLS block (LDR, STR). */ ++#define R_ARM_TLS_IE12GP 111 /* 12 bit GOT entry relative ++ to GOT origin (LDR). */ ++#define R_ARM_ME_TOO 128 /* Obsolete. */ ++#define R_ARM_THM_TLS_DESCSEQ 129 ++#define R_ARM_THM_TLS_DESCSEQ16 129 ++#define R_ARM_THM_TLS_DESCSEQ32 130 ++#define R_ARM_THM_GOT_BREL12 131 /* GOT entry relative to GOT ++ origin, 12 bit (Thumb32 LDR). */ ++#define R_ARM_IRELATIVE 160 + #define R_ARM_RXPC25 249 + #define R_ARM_RSBREL32 250 + #define R_ARM_THM_RPC22 251 +@@ -2393,6 +2708,30 @@ typedef Elf32_Addr Elf32_Conflict; + + /* SH specific declarations */ + ++/* Processor specific flags for the ELF header e_flags field. */ ++#define EF_SH_MACH_MASK 0x1f ++#define EF_SH_UNKNOWN 0x0 ++#define EF_SH1 0x1 ++#define EF_SH2 0x2 ++#define EF_SH3 0x3 ++#define EF_SH_DSP 0x4 ++#define EF_SH3_DSP 0x5 ++#define EF_SH4AL_DSP 0x6 ++#define EF_SH3E 0x8 ++#define EF_SH4 0x9 ++#define EF_SH2E 0xb ++#define EF_SH4A 0xc ++#define EF_SH2A 0xd ++#define EF_SH4_NOFPU 0x10 ++#define EF_SH4A_NOFPU 0x11 ++#define EF_SH4_NOMMU_NOFPU 0x12 ++#define EF_SH2A_NOFPU 0x13 ++#define EF_SH3_NOMMU 0x14 ++#define EF_SH2A_SH4_NOFPU 0x15 ++#define EF_SH2A_SH3_NOFPU 0x16 ++#define EF_SH2A_SH4 0x17 ++#define EF_SH2A_SH3E 0x18 ++ + /* SH relocs. */ + #define R_SH_NONE 0 + #define R_SH_DIR32 1 +@@ -2434,6 +2773,12 @@ typedef Elf32_Addr Elf32_Conflict; + /* Keep this the last entry. */ + #define R_SH_NUM 256 + ++/* S/390 specific definitions. */ ++ ++/* Valid values for the e_flags field. */ ++ ++#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */ ++ + /* Additional s390 relocs */ + + #define R_390_NONE 0 /* No reloc. */ +@@ -2515,8 +2860,9 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_390_GOTPLT20 59 /* 20 bit offset to jump slot. */ + #define R_390_TLS_GOTIE20 60 /* 20 bit GOT offset for static TLS + block offset. */ ++#define R_390_IRELATIVE 61 /* STT_GNU_IFUNC relocation. */ + /* Keep this the last entry. */ +-#define R_390_NUM 61 ++#define R_390_NUM 62 + + + /* CRIS relocations. */ +@@ -2577,13 +2923,23 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */ + #define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative + offset to GOT */ +-/* 27 .. 33 */ ++#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */ ++#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset ++ to GOT entry */ ++#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */ ++#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */ ++#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset ++ to PLT entry */ ++#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */ ++#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */ + #define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */ + #define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS + descriptor. */ + #define R_X86_64_TLSDESC 36 /* TLS descriptor. */ ++#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ ++#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ + +-#define R_X86_64_NUM 37 ++#define R_X86_64_NUM 39 + + + /* AM33 relocations. */ +@@ -2611,8 +2967,23 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */ + #define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */ + #define R_MN10300_RELATIVE 23 /* Adjust by program base. */ +- +-#define R_MN10300_NUM 24 ++#define R_MN10300_TLS_GD 24 /* 32-bit offset for global dynamic. */ ++#define R_MN10300_TLS_LD 25 /* 32-bit offset for local dynamic. */ ++#define R_MN10300_TLS_LDO 26 /* Module-relative offset. */ ++#define R_MN10300_TLS_GOTIE 27 /* GOT offset for static TLS block ++ offset. */ ++#define R_MN10300_TLS_IE 28 /* GOT address for static TLS block ++ offset. */ ++#define R_MN10300_TLS_LE 29 /* Offset relative to static TLS ++ block. */ ++#define R_MN10300_TLS_DTPMOD 30 /* ID of module containing symbol. */ ++#define R_MN10300_TLS_DTPOFF 31 /* Offset in module TLS block. */ ++#define R_MN10300_TLS_TPOFF 32 /* Offset in static TLS block. */ ++#define R_MN10300_SYM_DIFF 33 /* Adjustment for next reloc as needed ++ by linker relaxation. */ ++#define R_MN10300_ALIGN 34 /* Alignment requirement for linker ++ relaxation. */ ++#define R_MN10300_NUM 35 + + + /* M32R relocs. */ +@@ -2670,5 +3041,264 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */ + #define R_M32R_NUM 256 /* Keep this the last entry. */ + ++/* MicroBlaze relocations */ ++#define R_MICROBLAZE_NONE 0 /* No reloc. */ ++#define R_MICROBLAZE_32 1 /* Direct 32 bit. */ ++#define R_MICROBLAZE_32_PCREL 2 /* PC relative 32 bit. */ ++#define R_MICROBLAZE_64_PCREL 3 /* PC relative 64 bit. */ ++#define R_MICROBLAZE_32_PCREL_LO 4 /* Low 16 bits of PCREL32. */ ++#define R_MICROBLAZE_64 5 /* Direct 64 bit. */ ++#define R_MICROBLAZE_32_LO 6 /* Low 16 bit. */ ++#define R_MICROBLAZE_SRO32 7 /* Read-only small data area. */ ++#define R_MICROBLAZE_SRW32 8 /* Read-write small data area. */ ++#define R_MICROBLAZE_64_NONE 9 /* No reloc. */ ++#define R_MICROBLAZE_32_SYM_OP_SYM 10 /* Symbol Op Symbol relocation. */ ++#define R_MICROBLAZE_GNU_VTINHERIT 11 /* GNU C++ vtable hierarchy. */ ++#define R_MICROBLAZE_GNU_VTENTRY 12 /* GNU C++ vtable member usage. */ ++#define R_MICROBLAZE_GOTPC_64 13 /* PC-relative GOT offset. */ ++#define R_MICROBLAZE_GOT_64 14 /* GOT entry offset. */ ++#define R_MICROBLAZE_PLT_64 15 /* PLT offset (PC-relative). */ ++#define R_MICROBLAZE_REL 16 /* Adjust by program base. */ ++#define R_MICROBLAZE_JUMP_SLOT 17 /* Create PLT entry. */ ++#define R_MICROBLAZE_GLOB_DAT 18 /* Create GOT entry. */ ++#define R_MICROBLAZE_GOTOFF_64 19 /* 64 bit offset to GOT. */ ++#define R_MICROBLAZE_GOTOFF_32 20 /* 32 bit offset to GOT. */ ++#define R_MICROBLAZE_COPY 21 /* Runtime copy. */ ++#define R_MICROBLAZE_TLS 22 /* TLS Reloc. */ ++#define R_MICROBLAZE_TLSGD 23 /* TLS General Dynamic. */ ++#define R_MICROBLAZE_TLSLD 24 /* TLS Local Dynamic. */ ++#define R_MICROBLAZE_TLSDTPMOD32 25 /* TLS Module ID. */ ++#define R_MICROBLAZE_TLSDTPREL32 26 /* TLS Offset Within TLS Block. */ ++#define R_MICROBLAZE_TLSDTPREL64 27 /* TLS Offset Within TLS Block. */ ++#define R_MICROBLAZE_TLSGOTTPREL32 28 /* TLS Offset From Thread Pointer. */ ++#define R_MICROBLAZE_TLSTPREL32 29 /* TLS Offset From Thread Pointer. */ ++ ++/* TILEPro relocations. */ ++#define R_TILEPRO_NONE 0 /* No reloc */ ++#define R_TILEPRO_32 1 /* Direct 32 bit */ ++#define R_TILEPRO_16 2 /* Direct 16 bit */ ++#define R_TILEPRO_8 3 /* Direct 8 bit */ ++#define R_TILEPRO_32_PCREL 4 /* PC relative 32 bit */ ++#define R_TILEPRO_16_PCREL 5 /* PC relative 16 bit */ ++#define R_TILEPRO_8_PCREL 6 /* PC relative 8 bit */ ++#define R_TILEPRO_LO16 7 /* Low 16 bit */ ++#define R_TILEPRO_HI16 8 /* High 16 bit */ ++#define R_TILEPRO_HA16 9 /* High 16 bit, adjusted */ ++#define R_TILEPRO_COPY 10 /* Copy relocation */ ++#define R_TILEPRO_GLOB_DAT 11 /* Create GOT entry */ ++#define R_TILEPRO_JMP_SLOT 12 /* Create PLT entry */ ++#define R_TILEPRO_RELATIVE 13 /* Adjust by program base */ ++#define R_TILEPRO_BROFF_X1 14 /* X1 pipe branch offset */ ++#define R_TILEPRO_JOFFLONG_X1 15 /* X1 pipe jump offset */ ++#define R_TILEPRO_JOFFLONG_X1_PLT 16 /* X1 pipe jump offset to PLT */ ++#define R_TILEPRO_IMM8_X0 17 /* X0 pipe 8-bit */ ++#define R_TILEPRO_IMM8_Y0 18 /* Y0 pipe 8-bit */ ++#define R_TILEPRO_IMM8_X1 19 /* X1 pipe 8-bit */ ++#define R_TILEPRO_IMM8_Y1 20 /* Y1 pipe 8-bit */ ++#define R_TILEPRO_MT_IMM15_X1 21 /* X1 pipe mtspr */ ++#define R_TILEPRO_MF_IMM15_X1 22 /* X1 pipe mfspr */ ++#define R_TILEPRO_IMM16_X0 23 /* X0 pipe 16-bit */ ++#define R_TILEPRO_IMM16_X1 24 /* X1 pipe 16-bit */ ++#define R_TILEPRO_IMM16_X0_LO 25 /* X0 pipe low 16-bit */ ++#define R_TILEPRO_IMM16_X1_LO 26 /* X1 pipe low 16-bit */ ++#define R_TILEPRO_IMM16_X0_HI 27 /* X0 pipe high 16-bit */ ++#define R_TILEPRO_IMM16_X1_HI 28 /* X1 pipe high 16-bit */ ++#define R_TILEPRO_IMM16_X0_HA 29 /* X0 pipe high 16-bit, adjusted */ ++#define R_TILEPRO_IMM16_X1_HA 30 /* X1 pipe high 16-bit, adjusted */ ++#define R_TILEPRO_IMM16_X0_PCREL 31 /* X0 pipe PC relative 16 bit */ ++#define R_TILEPRO_IMM16_X1_PCREL 32 /* X1 pipe PC relative 16 bit */ ++#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */ ++#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */ ++#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */ ++#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */ ++#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */ ++#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */ ++#define R_TILEPRO_IMM16_X0_GOT 39 /* X0 pipe 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X1_GOT 40 /* X1 pipe 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X0_GOT_LO 41 /* X0 pipe low 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X1_GOT_LO 42 /* X1 pipe low 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X0_GOT_HI 43 /* X0 pipe high 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X1_GOT_HI 44 /* X1 pipe high 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X0_GOT_HA 45 /* X0 pipe ha() 16-bit GOT offset */ ++#define R_TILEPRO_IMM16_X1_GOT_HA 46 /* X1 pipe ha() 16-bit GOT offset */ ++#define R_TILEPRO_MMSTART_X0 47 /* X0 pipe mm "start" */ ++#define R_TILEPRO_MMEND_X0 48 /* X0 pipe mm "end" */ ++#define R_TILEPRO_MMSTART_X1 49 /* X1 pipe mm "start" */ ++#define R_TILEPRO_MMEND_X1 50 /* X1 pipe mm "end" */ ++#define R_TILEPRO_SHAMT_X0 51 /* X0 pipe shift amount */ ++#define R_TILEPRO_SHAMT_X1 52 /* X1 pipe shift amount */ ++#define R_TILEPRO_SHAMT_Y0 53 /* Y0 pipe shift amount */ ++#define R_TILEPRO_SHAMT_Y1 54 /* Y1 pipe shift amount */ ++#define R_TILEPRO_DEST_IMM8_X1 55 /* X1 pipe destination 8-bit */ ++/* Relocs 56-59 are currently not defined. */ ++#define R_TILEPRO_TLS_GD_CALL 60 /* "jal" for TLS GD */ ++#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61 /* X0 pipe "addi" for TLS GD */ ++#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62 /* X1 pipe "addi" for TLS GD */ ++#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63 /* Y0 pipe "addi" for TLS GD */ ++#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64 /* Y1 pipe "addi" for TLS GD */ ++#define R_TILEPRO_TLS_IE_LOAD 65 /* "lw_tls" for TLS IE */ ++#define R_TILEPRO_IMM16_X0_TLS_GD 66 /* X0 pipe 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X1_TLS_GD 67 /* X1 pipe 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68 /* X0 pipe low 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69 /* X1 pipe low 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70 /* X0 pipe high 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71 /* X1 pipe high 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72 /* X0 pipe ha() 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73 /* X1 pipe ha() 16-bit TLS GD offset */ ++#define R_TILEPRO_IMM16_X0_TLS_IE 74 /* X0 pipe 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_IE 75 /* X1 pipe 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76 /* X0 pipe low 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77 /* X1 pipe low 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78 /* X0 pipe high 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79 /* X1 pipe high 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80 /* X0 pipe ha() 16-bit TLS IE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81 /* X1 pipe ha() 16-bit TLS IE offset */ ++#define R_TILEPRO_TLS_DTPMOD32 82 /* ID of module containing symbol */ ++#define R_TILEPRO_TLS_DTPOFF32 83 /* Offset in TLS block */ ++#define R_TILEPRO_TLS_TPOFF32 84 /* Offset in static TLS block */ ++#define R_TILEPRO_IMM16_X0_TLS_LE 85 /* X0 pipe 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_LE 86 /* X1 pipe 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87 /* X0 pipe low 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88 /* X1 pipe low 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89 /* X0 pipe high 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90 /* X1 pipe high 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91 /* X0 pipe ha() 16-bit TLS LE offset */ ++#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92 /* X1 pipe ha() 16-bit TLS LE offset */ ++ ++#define R_TILEPRO_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ ++#define R_TILEPRO_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ ++ ++#define R_TILEPRO_NUM 130 ++ ++ ++/* TILE-Gx relocations. */ ++#define R_TILEGX_NONE 0 /* No reloc */ ++#define R_TILEGX_64 1 /* Direct 64 bit */ ++#define R_TILEGX_32 2 /* Direct 32 bit */ ++#define R_TILEGX_16 3 /* Direct 16 bit */ ++#define R_TILEGX_8 4 /* Direct 8 bit */ ++#define R_TILEGX_64_PCREL 5 /* PC relative 64 bit */ ++#define R_TILEGX_32_PCREL 6 /* PC relative 32 bit */ ++#define R_TILEGX_16_PCREL 7 /* PC relative 16 bit */ ++#define R_TILEGX_8_PCREL 8 /* PC relative 8 bit */ ++#define R_TILEGX_HW0 9 /* hword 0 16-bit */ ++#define R_TILEGX_HW1 10 /* hword 1 16-bit */ ++#define R_TILEGX_HW2 11 /* hword 2 16-bit */ ++#define R_TILEGX_HW3 12 /* hword 3 16-bit */ ++#define R_TILEGX_HW0_LAST 13 /* last hword 0 16-bit */ ++#define R_TILEGX_HW1_LAST 14 /* last hword 1 16-bit */ ++#define R_TILEGX_HW2_LAST 15 /* last hword 2 16-bit */ ++#define R_TILEGX_COPY 16 /* Copy relocation */ ++#define R_TILEGX_GLOB_DAT 17 /* Create GOT entry */ ++#define R_TILEGX_JMP_SLOT 18 /* Create PLT entry */ ++#define R_TILEGX_RELATIVE 19 /* Adjust by program base */ ++#define R_TILEGX_BROFF_X1 20 /* X1 pipe branch offset */ ++#define R_TILEGX_JUMPOFF_X1 21 /* X1 pipe jump offset */ ++#define R_TILEGX_JUMPOFF_X1_PLT 22 /* X1 pipe jump offset to PLT */ ++#define R_TILEGX_IMM8_X0 23 /* X0 pipe 8-bit */ ++#define R_TILEGX_IMM8_Y0 24 /* Y0 pipe 8-bit */ ++#define R_TILEGX_IMM8_X1 25 /* X1 pipe 8-bit */ ++#define R_TILEGX_IMM8_Y1 26 /* Y1 pipe 8-bit */ ++#define R_TILEGX_DEST_IMM8_X1 27 /* X1 pipe destination 8-bit */ ++#define R_TILEGX_MT_IMM14_X1 28 /* X1 pipe mtspr */ ++#define R_TILEGX_MF_IMM14_X1 29 /* X1 pipe mfspr */ ++#define R_TILEGX_MMSTART_X0 30 /* X0 pipe mm "start" */ ++#define R_TILEGX_MMEND_X0 31 /* X0 pipe mm "end" */ ++#define R_TILEGX_SHAMT_X0 32 /* X0 pipe shift amount */ ++#define R_TILEGX_SHAMT_X1 33 /* X1 pipe shift amount */ ++#define R_TILEGX_SHAMT_Y0 34 /* Y0 pipe shift amount */ ++#define R_TILEGX_SHAMT_Y1 35 /* Y1 pipe shift amount */ ++#define R_TILEGX_IMM16_X0_HW0 36 /* X0 pipe hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0 37 /* X1 pipe hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1 38 /* X0 pipe hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1 39 /* X1 pipe hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2 40 /* X0 pipe hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2 41 /* X1 pipe hword 2 */ ++#define R_TILEGX_IMM16_X0_HW3 42 /* X0 pipe hword 3 */ ++#define R_TILEGX_IMM16_X1_HW3 43 /* X1 pipe hword 3 */ ++#define R_TILEGX_IMM16_X0_HW0_LAST 44 /* X0 pipe last hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0_LAST 45 /* X1 pipe last hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1_LAST 46 /* X0 pipe last hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1_LAST 47 /* X1 pipe last hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2_LAST 48 /* X0 pipe last hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2_LAST 49 /* X1 pipe last hword 2 */ ++#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */ ++#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */ ++#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */ ++#define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */ ++#define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */ ++#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */ ++#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */ ++#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */ ++#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */ ++#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */ ++#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */ ++#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81 /* X1 pipe hword 0 TLS LE offset */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */ ++/* Relocs 90-91 are currently not defined. */ ++#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */ ++#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */ ++#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */ ++#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */ ++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */ ++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */ ++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */ ++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */ ++/* Relocs 104-105 are currently not defined. */ ++#define R_TILEGX_TLS_DTPMOD64 106 /* 64-bit ID of symbol's module */ ++#define R_TILEGX_TLS_DTPOFF64 107 /* 64-bit offset in TLS block */ ++#define R_TILEGX_TLS_TPOFF64 108 /* 64-bit offset in static TLS block */ ++#define R_TILEGX_TLS_DTPMOD32 109 /* 32-bit ID of symbol's module */ ++#define R_TILEGX_TLS_DTPOFF32 110 /* 32-bit offset in TLS block */ ++#define R_TILEGX_TLS_TPOFF32 111 /* 32-bit offset in static TLS block */ ++#define R_TILEGX_TLS_GD_CALL 112 /* "jal" for TLS GD */ ++#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113 /* X0 pipe "addi" for TLS GD */ ++#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114 /* X1 pipe "addi" for TLS GD */ ++#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115 /* Y0 pipe "addi" for TLS GD */ ++#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116 /* Y1 pipe "addi" for TLS GD */ ++#define R_TILEGX_TLS_IE_LOAD 117 /* "ld_tls" for TLS IE */ ++#define R_TILEGX_IMM8_X0_TLS_ADD 118 /* X0 pipe "addi" for TLS GD/IE */ ++#define R_TILEGX_IMM8_X1_TLS_ADD 119 /* X1 pipe "addi" for TLS GD/IE */ ++#define R_TILEGX_IMM8_Y0_TLS_ADD 120 /* Y0 pipe "addi" for TLS GD/IE */ ++#define R_TILEGX_IMM8_Y1_TLS_ADD 121 /* Y1 pipe "addi" for TLS GD/IE */ ++ ++#define R_TILEGX_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ ++#define R_TILEGX_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ ++ ++#define R_TILEGX_NUM 130 ++ ++ ++/* __END_DECLS */ + + #endif /* elf.h */ +--- a/build_scripts/main.py ++++ b/build_scripts/main.py +@@ -894,8 +894,14 @@ class PysideBuild(_build): + return + log.info("Building patchelf...") + module_src_dir = os.path.join(self.sources_dir, "patchelf") ++ import subprocess ++ pagesize = subprocess.check_output("getconf PAGESIZE", shell=True).decode('utf-8').rstrip() + build_cmd = [ + "g++", ++ "-std=c++11", ++ "-DPAGESIZE=%s" % (pagesize), ++ '-DPACKAGE_STRING="patchelf"', ++ "-D_FILE_OFFSET_BITS=64", + "{}/patchelf.cc".format(module_src_dir), + "-o", + "patchelf", diff --git a/pyside2-tools.install b/pyside2-tools.install new file mode 100644 index 0000000..46408b0 --- /dev/null +++ b/pyside2-tools.install @@ -0,0 +1 @@ +pyside2_install/py2.*/bin/pyside2-* usr/bin diff --git a/pyside2-tools.manpages b/pyside2-tools.manpages new file mode 100644 index 0000000..ca1b931 --- /dev/null +++ b/pyside2-tools.manpages @@ -0,0 +1,2 @@ +pyside3_install/py3*/share/man/man1/pyside2-* + diff --git a/python-pyside2-doc.docs b/python-pyside2-doc.docs new file mode 100644 index 0000000..6d28621 --- /dev/null +++ b/python-pyside2-doc.docs @@ -0,0 +1 @@ +build/html diff --git a/python-pyside2-doc.examples b/python-pyside2-doc.examples new file mode 100644 index 0000000..e39721e --- /dev/null +++ b/python-pyside2-doc.examples @@ -0,0 +1 @@ +examples/* diff --git a/python-pyside2.qt3dcore.install b/python-pyside2.qt3dcore.install new file mode 100644 index 0000000..508667b --- /dev/null +++ b/python-pyside2.qt3dcore.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/Qt3DCore.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qt3dinput.install b/python-pyside2.qt3dinput.install new file mode 100644 index 0000000..d66be71 --- /dev/null +++ b/python-pyside2.qt3dinput.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/Qt3DInput.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qt3dlogic.install b/python-pyside2.qt3dlogic.install new file mode 100644 index 0000000..3f4f3e0 --- /dev/null +++ b/python-pyside2.qt3dlogic.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/Qt3DLogic.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qt3drender.install b/python-pyside2.qt3drender.install new file mode 100644 index 0000000..a61c6df --- /dev/null +++ b/python-pyside2.qt3drender.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/Qt3DRender.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtcharts.install b/python-pyside2.qtcharts.install new file mode 100644 index 0000000..23c5c77 --- /dev/null +++ b/python-pyside2.qtcharts.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtCharts.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtconcurrent.install b/python-pyside2.qtconcurrent.install new file mode 100644 index 0000000..869a191 --- /dev/null +++ b/python-pyside2.qtconcurrent.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtConcurrent.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtcore.install b/python-pyside2.qtcore.install new file mode 100644 index 0000000..e1e603a --- /dev/null +++ b/python-pyside2.qtcore.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtCore.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtgui.install b/python-pyside2.qtgui.install new file mode 100644 index 0000000..f49a785 --- /dev/null +++ b/python-pyside2.qtgui.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtGui.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qthelp.install b/python-pyside2.qthelp.install new file mode 100644 index 0000000..327c40f --- /dev/null +++ b/python-pyside2.qthelp.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtHelp.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtlocation.install b/python-pyside2.qtlocation.install new file mode 100644 index 0000000..0e002c5 --- /dev/null +++ b/python-pyside2.qtlocation.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtLocation.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtmultimedia.install b/python-pyside2.qtmultimedia.install new file mode 100644 index 0000000..0f7a246 --- /dev/null +++ b/python-pyside2.qtmultimedia.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtMultimedia.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtmultimediawidgets.install b/python-pyside2.qtmultimediawidgets.install new file mode 100644 index 0000000..bc041b3 --- /dev/null +++ b/python-pyside2.qtmultimediawidgets.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtMultimediaWidgets.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtnetwork.install b/python-pyside2.qtnetwork.install new file mode 100644 index 0000000..acabe76 --- /dev/null +++ b/python-pyside2.qtnetwork.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtNetwork.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtopengl.install b/python-pyside2.qtopengl.install new file mode 100644 index 0000000..dc6d89d --- /dev/null +++ b/python-pyside2.qtopengl.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtOpenGL.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtpositioning.install b/python-pyside2.qtpositioning.install new file mode 100644 index 0000000..dc280cf --- /dev/null +++ b/python-pyside2.qtpositioning.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtPositioning.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtprintsupport.install b/python-pyside2.qtprintsupport.install new file mode 100644 index 0000000..6889749 --- /dev/null +++ b/python-pyside2.qtprintsupport.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtPrintSupport.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtqml.install b/python-pyside2.qtqml.install new file mode 100644 index 0000000..93c5c46 --- /dev/null +++ b/python-pyside2.qtqml.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtQml.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtquick.install b/python-pyside2.qtquick.install new file mode 100644 index 0000000..d48513f --- /dev/null +++ b/python-pyside2.qtquick.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtQuick.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtquickwidgets.install b/python-pyside2.qtquickwidgets.install new file mode 100644 index 0000000..7f34bb5 --- /dev/null +++ b/python-pyside2.qtquickwidgets.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtQuickWidgets.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtscript.install b/python-pyside2.qtscript.install new file mode 100644 index 0000000..e7d6384 --- /dev/null +++ b/python-pyside2.qtscript.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtScript.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtscripttools.install b/python-pyside2.qtscripttools.install new file mode 100644 index 0000000..21288fa --- /dev/null +++ b/python-pyside2.qtscripttools.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtScriptTools.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtsensors.install b/python-pyside2.qtsensors.install new file mode 100644 index 0000000..7300408 --- /dev/null +++ b/python-pyside2.qtsensors.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtSensors.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtsql.install b/python-pyside2.qtsql.install new file mode 100644 index 0000000..a8ddadc --- /dev/null +++ b/python-pyside2.qtsql.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtSql.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtsvg.install b/python-pyside2.qtsvg.install new file mode 100644 index 0000000..645d8cb --- /dev/null +++ b/python-pyside2.qtsvg.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtSvg.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qttest.install b/python-pyside2.qttest.install new file mode 100644 index 0000000..0aa8e9e --- /dev/null +++ b/python-pyside2.qttest.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtTest.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qttexttospeech.install b/python-pyside2.qttexttospeech.install new file mode 100644 index 0000000..4ea352e --- /dev/null +++ b/python-pyside2.qttexttospeech.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtTextToSpeech.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtuitools.install b/python-pyside2.qtuitools.install new file mode 100644 index 0000000..4167fe1 --- /dev/null +++ b/python-pyside2.qtuitools.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtUiTools.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtwebchannel.install b/python-pyside2.qtwebchannel.install new file mode 100644 index 0000000..7624483 --- /dev/null +++ b/python-pyside2.qtwebchannel.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtWebChannel.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtwebenginecore.install b/python-pyside2.qtwebenginecore.install new file mode 100644 index 0000000..11fc692 --- /dev/null +++ b/python-pyside2.qtwebenginecore.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtWebEngineCore.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtwebenginewidgets.install b/python-pyside2.qtwebenginewidgets.install new file mode 100644 index 0000000..216c9a0 --- /dev/null +++ b/python-pyside2.qtwebenginewidgets.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtWebEngineWidgets.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtwebsockets.install b/python-pyside2.qtwebsockets.install new file mode 100644 index 0000000..23c7dc4 --- /dev/null +++ b/python-pyside2.qtwebsockets.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtWebSockets.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtwidgets.install b/python-pyside2.qtwidgets.install new file mode 100644 index 0000000..3b6294d --- /dev/null +++ b/python-pyside2.qtwidgets.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtWidgets.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtx11extras.install b/python-pyside2.qtx11extras.install new file mode 100644 index 0000000..06a86eb --- /dev/null +++ b/python-pyside2.qtx11extras.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtX11Extras.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtxml.install b/python-pyside2.qtxml.install new file mode 100644 index 0000000..eed9b48 --- /dev/null +++ b/python-pyside2.qtxml.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtXml.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2.qtxmlpatterns.install b/python-pyside2.qtxmlpatterns.install new file mode 100644 index 0000000..684894a --- /dev/null +++ b/python-pyside2.qtxmlpatterns.install @@ -0,0 +1 @@ +pyside2_install/py*-relwithdebinfo/lib/python2.7/site-packages/PySide2/QtXmlPatterns.*.so usr/lib/python2.7/dist-packages/PySide2 diff --git a/python-pyside2uic.install b/python-pyside2uic.install new file mode 100644 index 0000000..3f34b03 --- /dev/null +++ b/python-pyside2uic.install @@ -0,0 +1 @@ +pyside2_install/py2*/lib/python2.7/site-packages/pyside2uic usr/lib/python2.7/dist-packages/ diff --git a/python3-pyside2.qt3dcore.install b/python3-pyside2.qt3dcore.install new file mode 100644 index 0000000..cc90239 --- /dev/null +++ b/python3-pyside2.qt3dcore.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/Qt3DCore.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qt3dinput.install b/python3-pyside2.qt3dinput.install new file mode 100644 index 0000000..400bae0 --- /dev/null +++ b/python3-pyside2.qt3dinput.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/Qt3DInput.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qt3dlogic.install b/python3-pyside2.qt3dlogic.install new file mode 100644 index 0000000..b1976e1 --- /dev/null +++ b/python3-pyside2.qt3dlogic.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/Qt3DLogic.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qt3drender.install b/python3-pyside2.qt3drender.install new file mode 100644 index 0000000..6047dea --- /dev/null +++ b/python3-pyside2.qt3drender.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/Qt3DRender.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtcharts.install b/python3-pyside2.qtcharts.install new file mode 100644 index 0000000..52255de --- /dev/null +++ b/python3-pyside2.qtcharts.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtCharts.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtconcurrent.install b/python3-pyside2.qtconcurrent.install new file mode 100644 index 0000000..ed9eae0 --- /dev/null +++ b/python3-pyside2.qtconcurrent.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtConcurrent.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtcore.install b/python3-pyside2.qtcore.install new file mode 100644 index 0000000..18bfbc7 --- /dev/null +++ b/python3-pyside2.qtcore.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtCore.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtgui.install b/python3-pyside2.qtgui.install new file mode 100644 index 0000000..9c8d25c --- /dev/null +++ b/python3-pyside2.qtgui.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtGui.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qthelp.install b/python3-pyside2.qthelp.install new file mode 100644 index 0000000..8012c75 --- /dev/null +++ b/python3-pyside2.qthelp.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtHelp.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtlocation.install b/python3-pyside2.qtlocation.install new file mode 100644 index 0000000..133e850 --- /dev/null +++ b/python3-pyside2.qtlocation.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtLocation.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtmultimedia.install b/python3-pyside2.qtmultimedia.install new file mode 100644 index 0000000..e100d1e --- /dev/null +++ b/python3-pyside2.qtmultimedia.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtMultimedia.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtmultimediawidgets.install b/python3-pyside2.qtmultimediawidgets.install new file mode 100644 index 0000000..11420f9 --- /dev/null +++ b/python3-pyside2.qtmultimediawidgets.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtMultimediaWidgets.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtnetwork.install b/python3-pyside2.qtnetwork.install new file mode 100644 index 0000000..cddff59 --- /dev/null +++ b/python3-pyside2.qtnetwork.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtNetwork.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtopengl.install b/python3-pyside2.qtopengl.install new file mode 100644 index 0000000..736e241 --- /dev/null +++ b/python3-pyside2.qtopengl.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtOpenGL.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtpositioning.install b/python3-pyside2.qtpositioning.install new file mode 100644 index 0000000..2375c30 --- /dev/null +++ b/python3-pyside2.qtpositioning.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtPositioning.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtprintsupport.install b/python3-pyside2.qtprintsupport.install new file mode 100644 index 0000000..72eb659 --- /dev/null +++ b/python3-pyside2.qtprintsupport.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtPrintSupport.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtqml.install b/python3-pyside2.qtqml.install new file mode 100644 index 0000000..8116b2d --- /dev/null +++ b/python3-pyside2.qtqml.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtQml.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtquick.install b/python3-pyside2.qtquick.install new file mode 100644 index 0000000..d2045b1 --- /dev/null +++ b/python3-pyside2.qtquick.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtQuick.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtquickwidgets.install b/python3-pyside2.qtquickwidgets.install new file mode 100644 index 0000000..8e61233 --- /dev/null +++ b/python3-pyside2.qtquickwidgets.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtQuickWidgets.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtscript.install b/python3-pyside2.qtscript.install new file mode 100644 index 0000000..b0b1aa5 --- /dev/null +++ b/python3-pyside2.qtscript.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtScript.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtscripttools.install b/python3-pyside2.qtscripttools.install new file mode 100644 index 0000000..9cf3a61 --- /dev/null +++ b/python3-pyside2.qtscripttools.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtScriptTools.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtsensors.install b/python3-pyside2.qtsensors.install new file mode 100644 index 0000000..4ac8aee --- /dev/null +++ b/python3-pyside2.qtsensors.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtSensors.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtsql.install b/python3-pyside2.qtsql.install new file mode 100644 index 0000000..b50b3e4 --- /dev/null +++ b/python3-pyside2.qtsql.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtSql.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtsvg.install b/python3-pyside2.qtsvg.install new file mode 100644 index 0000000..522de6c --- /dev/null +++ b/python3-pyside2.qtsvg.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtSvg.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qttest.install b/python3-pyside2.qttest.install new file mode 100644 index 0000000..bc16f74 --- /dev/null +++ b/python3-pyside2.qttest.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtTest.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qttexttospeech.install b/python3-pyside2.qttexttospeech.install new file mode 100644 index 0000000..28fcab4 --- /dev/null +++ b/python3-pyside2.qttexttospeech.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtTextToSpeech.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtuitools.install b/python3-pyside2.qtuitools.install new file mode 100644 index 0000000..9bbb6db --- /dev/null +++ b/python3-pyside2.qtuitools.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtUiTools.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtwebchannel.install b/python3-pyside2.qtwebchannel.install new file mode 100644 index 0000000..97ab7cf --- /dev/null +++ b/python3-pyside2.qtwebchannel.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtWebChannel.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtwebenginecore.install b/python3-pyside2.qtwebenginecore.install new file mode 100644 index 0000000..efe85a2 --- /dev/null +++ b/python3-pyside2.qtwebenginecore.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtWebEngineCore.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtwebenginewidgets.install b/python3-pyside2.qtwebenginewidgets.install new file mode 100644 index 0000000..3dbc143 --- /dev/null +++ b/python3-pyside2.qtwebenginewidgets.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtWebEngineWidgets.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtwebsockets.install b/python3-pyside2.qtwebsockets.install new file mode 100644 index 0000000..54f3e1b --- /dev/null +++ b/python3-pyside2.qtwebsockets.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtWebSockets.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtwidgets.install b/python3-pyside2.qtwidgets.install new file mode 100644 index 0000000..ff9a2ce --- /dev/null +++ b/python3-pyside2.qtwidgets.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtWidgets.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtx11extras.install b/python3-pyside2.qtx11extras.install new file mode 100644 index 0000000..9d56ddd --- /dev/null +++ b/python3-pyside2.qtx11extras.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtX11Extras.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtxml.install b/python3-pyside2.qtxml.install new file mode 100644 index 0000000..714f2b4 --- /dev/null +++ b/python3-pyside2.qtxml.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtXml.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2.qtxmlpatterns.install b/python3-pyside2.qtxmlpatterns.install new file mode 100644 index 0000000..a4b464d --- /dev/null +++ b/python3-pyside2.qtxmlpatterns.install @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/lib/python3*/site-packages/PySide2/QtXmlPatterns.*.so usr/lib/python3/dist-packages/PySide2 diff --git a/python3-pyside2uic.install b/python3-pyside2uic.install new file mode 100644 index 0000000..d70990b --- /dev/null +++ b/python3-pyside2uic.install @@ -0,0 +1 @@ +pyside3_install/py3*/lib/python3*/site-packages/pyside2uic usr/lib/python3/dist-packages/ diff --git a/rules b/rules new file mode 100755 index 0000000..0d489da --- /dev/null +++ b/rules @@ -0,0 +1,57 @@ +#!/usr/bin/make -f + +include /usr/share/dpkg/pkg-info.mk + +# Safety measure to ensure package names match SONAMEs +PYSIDE_MAJOR := $(shell echo $(DEB_VERSION_UPSTREAM) | cut -d. -f1-2) +ifeq ($(shell awk '/Package:/ {print $$2}' debian/control | grep -- -$(PYSIDE_MAJOR)$$),) + $(error Please update package names for major version $(PYSIDE_MAJOR)) +endif +ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) + OPTION_JOBS = --jobs=$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +endif + +export PYBUILD_NAME=pyside2 +export PYBUILD_BUILD_ARGS=--relwithdebinfo --verbose-build --no-examples $(OPTION_JOBS) + +export MAIN_VERSION_UPSTREAM := $(shell echo $(DEB_VERSION_UPSTREAM)) +export DEB_BUILD_MAINT_OPTIONS = hardening=+all +# Add CPPFLAGS to CXXFLAGS as CMake ignores CPPFLAGS by default +CXXFLAGS+=$(CPPFLAGS) + +# Until https://bugreports.qt.io/browse/PYSIDE-741 is fixed +export PYBUILD_DISABLE_python3.7=test + +%: + dh $@ --with python2,python3,sphinxdoc --buildsystem=pybuild + +override_dh_auto_build: + dh_auto_build + PYTHONPATH=. http_proxy='127.0.0.1:9' sphinx-build -N -bhtml docs/ build/html # HTML generator + +override_dh_auto_install: + # Don't use pybuild install process, we take over this step to + # split files in the way we want it. But we echo the list of files + # built to make it easier to update *.install files. + echo ">>> In pyside*_{package,install}" + -find pyside_package pyside*_install + +override_dh_makeshlibs: + dh_makeshlibs -VUpstream-Version + +override_dh_install-indep: + dh_install -X.doctrees + # drop specific Python2 or Python code in packages. Otherwise it + # will fail during the packages installation + rm -r debian/python-pyside2uic/usr/lib/python2.7/dist-packages/pyside2uic/port_v3 + rm -r debian/python3-pyside2uic/usr/lib/python3/dist-packages/pyside2uic/port_v2 + +override_dh_install-arch: + dh_install + # remove RUNPATH setup in shiboken2 + chrpath -d debian/shiboken2/usr/bin/shiboken2 + # change the library path in pkg-info/*.pc and in *.cmake files: + # during the build the path is setup to the build dir + # /build/pyside2* (required to find lib during the build) but it's + # not what we need + debian/set-paths diff --git a/set-paths b/set-paths new file mode 100755 index 0000000..883fccc --- /dev/null +++ b/set-paths @@ -0,0 +1,32 @@ +#!/bin/sh + +# Replace build directory value by install directory value +package="libshiboken2-dev" +for directory in "cmake/Shiboken2-$MAIN_VERSION_UPSTREAM" "pkgconfig"; do + sed -i "s|build.*relwithdebinfo/lib|usr/lib/$DEB_HOST_MULTIARCH|" \ + debian/$package/usr/lib/$DEB_HOST_MULTIARCH/$directory/*; + sed -i "s|build.*relwithdebinfo|usr|" \ + debian/$package/usr/lib/$DEB_HOST_MULTIARCH/$directory/*; +done + +package="libpyside2-dev" +for directory in "pkgconfig" "cmake/PySide2-$MAIN_VERSION_UPSTREAM"; do + sed -i "s|build.*relwithdebinfo/lib|usr/lib/$DEB_HOST_MULTIARCH|" \ + debian/$package/usr/lib/$DEB_HOST_MULTIARCH/$directory/*; + sed -i "s|build.*relwithdebinfo|usr|" \ + debian/$package/usr/lib/$DEB_HOST_MULTIARCH/$directory/*; +done + +# Set correctly the python path for pyside2 (Python2 for now) +sed -i "s|^pythonpath=.*|pythonpath=/usr/lib/python2.7/dist-packages|" \ + debian/libpyside2-dev/usr/lib/$DEB_HOST_MULTIARCH/pkgconfig/pyside2.pc + +sed -i "s|^SET(PYSIDE_PYTHONPATH.*|SET(PYSIDE_PYTHONPATH \"/usr/lib/python2.7/dist-packages\")|" \ + debian/libpyside2-dev/usr/lib/$DEB_HOST_MULTIARCH/cmake/PySide2-$MAIN_VERSION_UPSTREAM/PySide2Config-python2.7.$DEB_HOST_MULTIARCH.cmake + +# Set correctly the python path for pyside2 (Python3) +sed -i "s|^SET(PYSIDE_PYTHONPATH.*|SET(PYSIDE_PYTHONPATH \"/usr/lib/python3/dist-packages\")|" \ + debian/libpyside2-dev/usr/lib/$DEB_HOST_MULTIARCH/cmake/PySide2-$MAIN_VERSION_UPSTREAM/PySide2Config.cpython-3*m-$DEB_HOST_MULTIARCH.cmake + +#sed -i "s|^SET(PYSIDE_PYTHONPATH.*|SET(PYSIDE_PYTHONPATH \"/usr/lib/python3/dist-packages\")|" \ +# debian/libpyside2-dev/usr/lib/$DEB_HOST_MULTIARCH/cmake/PySide2-$MAIN_VERSION_UPSTREAM/PySide2Config.cpython-37m-$DEB_HOST_MULTIARCH.cmake diff --git a/shiboken2-doc.install b/shiboken2-doc.install new file mode 100644 index 0000000..f3f45b9 --- /dev/null +++ b/shiboken2-doc.install @@ -0,0 +1 @@ +pyside_package/PySide2/docs/shiboken2 usr/share/doc diff --git a/shiboken2.install b/shiboken2.install new file mode 100644 index 0000000..d1d1cfc --- /dev/null +++ b/shiboken2.install @@ -0,0 +1 @@ +pyside2_install/py2*-relwithdebinfo/bin/shiboken2 usr/bin diff --git a/shiboken2.manpages b/shiboken2.manpages new file mode 100644 index 0000000..df8e1ce --- /dev/null +++ b/shiboken2.manpages @@ -0,0 +1 @@ +pyside3_install/py*-relwithdebinfo/share/man/man1/shiboken2.1 diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/source/options b/source/options new file mode 100644 index 0000000..cb61fa5 --- /dev/null +++ b/source/options @@ -0,0 +1 @@ +extend-diff-ignore = "^[^/]*[.]egg-info/" diff --git a/watch b/watch new file mode 100644 index 0000000..a8f0b26 --- /dev/null +++ b/watch @@ -0,0 +1,2 @@ +version=4 +https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-([\d\.]+)-src/ pyside-setup-everywhere-src-@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate