meta-openembedded: subtree update:bccd3277e4..2258c9a767

Alejandro Enedino Hernandez Samaniego (1):
      gedit: Add gsettings-desktop-schemas to RDEPENDS

Alexander Vickberg (1):
      wolfssl: upgrade 4.4.0 -> 4.5.0

Andreas Müller (11):
      gnome-settings-daemon: Remove wrong RDEPEND
      gnome-desktop3: upgrade 3.36.5 -> 3.36.6
      grilo: upgrade 0.3.12 -> 0.3.13
      gspell: upgrade 1.8.3 -> 1.8.4
      libgdata: upgrade 0.17.12 -> 0.17.13
      tracker: upgrade 2.3.4 -> 2.3.6
      tracker-miners: upgrade 2.3.3 -> 2.3.5
      gjs: upgrade 1.58.7 -> 1.58.8
      xfce4-notifyd: upgrade 0.6.1 -> 0.6.2
      live555: upgrade 20200721 -> 20200819
      vlc: upgrade 3.0.11 -> 3.0.11.1

Andrey Zhizhikin (1):
      python3-pybind11: extend to native and nativesdk

Armin Kuster (3):
      cmocka: add recipe
      musl-nscd: add package
      add musl-nscd to pkg grps

Bartosz Golaszewski (2):
      libgpiod: drop support for 0.3.3
      libgpiod: consolidate the recipe files

Diego Rondini (1):
      README: fix incorrect links

Geoff Parker (1):
      multipath-tools: replace perl with sed in libdmmp/Makefile for pseudo

Gianfranco Costamagna (1):
      vboxguestdrivers: upgrade 6.1.12 -> 6.1.14 Drop kernel 5.8 compatibility patch, now part of upstream codebase

Hongxu Jia (4):
      python3-argcomplete: add recipe 1.12.0
      python3-dateutil/python3-pykwalify: add nativesdk support
      python3-pykwalify: fix missing comma
      python3-docopt: add version 0.6.2

Kai Kang (2):
      python3-iniconfig: add recipe
      python3-pytest: 5.4.3 -> 6.1.0

Khem Raj (3):
      st: Use update alternatives
      numactl: Link with libatomic on rv64/rv32
      ubi-utils-klibc: Remove trailing slash from S

Lee Chee Yang (4):
      ace : improve reproducibility
      libgphoto2: improve reproducibility
      tbb: improve reproducibility
      glog : improve reproducibility

Leon Anavi (57):
      python3-langtable: Upgrade 0.0.52 -> 0.0.53
      python3-sentry-sdk: Upgrade 0.17.5 -> 0.17.6
      python3-cmd2: Upgrade 1.3.9 -> 1.3.10
      python3-rfc3339-validator: Upgrade 0.1.1 -> 0.1.2
      python3-h2: Upgrade 3.2.0 -> 4.0.0
      python3-luma-core: Upgrade 1.16.1 -> 1.16.2
      python3-isort: Upgrade 5.5.2 -> 5.5.3
      python3-xlsxwriter: Upgrade 1.3.3 -> 1.3.4
      python3-flask-uploads: Consolidate in a single file
      python3-paho-mqtt: Upgrade 1.5.0 -> 1.5.1
      python3-sentry-sdk: Upgrade 0.17.6 -> 0.17.7
      python3-importlib-metadata: Upgrade 1.7.0 -> 2.0.0
      python3-pint: Upgrade 0.16 -> 0.16.1
      python3-zipp: Upgrade 3.1.0 -> 3.2.0
      python3-xlsxwriter: Upgrade 1.3.4 -> 1.3.5
      python3-greenlet: Upgrade 0.4.16 -> 0.4.17
      python3-xlsxwriter: Upgrade 1.3.5 -> 1.3.6
      python3-yarl: Upgrade 1.5.1 -> 1.6.0
      python3-sentry-sdk: Upgrade 0.17.7 -> 0.17.8
      python3-google-api-python-client: Upgrade 1.12.1 -> 1.12.2
      python3-cryptography: Upgrade 3.1 -> 3.1.1
      python3-cryptography-vectors: Upgrade 3.1 -> 3.1.1
      python3-gevent: Upgrade 20.6.2 -> 20.9.0
      python3-pycrypto: Consolidate in a single file
      python3-pychromecast: Upgrade 7.3.0 -> 7.5.0
      python3-beautifulsoup4: Upgrade 4.9.1 -> 4.9.2
      python3-tqdm: Upgrade 4.49.0 -> 4.50.0
      python3-argcomplete: Upgrade 1.12.0 -> 1.12.1
      python3-luma-core: Upgrade 1.16.2 -> 1.17.1
      python3-luma-oled: Upgrade 3.5.0 -> 3.6.0
      python3-regex: Upgrade 2020.7.14 -> 2020.9.27
      python3-djangorestframework: Upgrade 3.11.1 -> 3.12.1
      python3-isort: Upgrade 5.5.3 -> 5.5.4
      python3-cbor2: Upgrade 5.1.2 -> 5.2.0
      python3-humanize: Upgrade 2.6.0 -> 3.0.0
      python3-pystemd: Upgrade 0.7.0 -> 0.8.0
      python3-sentry-sdk: Upgrade 0.17.8 -> 0.18.0
      python3-nocasedict: Upgrade 1.0.0 -> 1.0.1
      python3-google-api-python-client: Upgrade 1.12.2 -> 1.12.3
      beautifulsoup4: Upgrade 4.9.2 -> 4.9.3
      python3-humanize: Upgrade 3.0.0 -> 3.0.1
      python3-zipp: Upgrade 3.2.0 -> 3.3.0
      python3-cmd2: Upgrade 1.3.10 -> 1.3.11
      python3-pywbemtools: Upgrade 0.7.1 -> 0.7.2
      python3-prettytable: Upgrade 0.7.2 -> 1.0.0
      python3-nocaselist: Upgrade 1.0.2 -> 1.0.3
      python3-pandas: Upgrade 1.1.2 -> 1.1.3
      python3-configparser: Upgrade 5.0.0 -> 5.0.1
      python3-pywbemtools: Upgrade 0.7.2 -> 0.7.3
      python3-colorlog: Upgrade 4.2.1 -> 4.4.0
      python3-markdown: Upgrade 3.2.2 -> 3.3
      python3-tqdm: Upgrade 4.50.0 -> 4.50.2
      python3-pywbem: Upgrade 1.0.2 -> 1.1.0
      python3-regex: Upgrade 2020.9.27 -> 2020.10.11
      python3-multidict: Upgrade 4.7.6 -> 5.0.0
      python3-prettytable: Upgrade 1.0.0 -> 1.0.1
      python3-pyperclip: Upgrade 1.8.0 -> 1.8.1

Lim Siew Hoon (1):
      Alliance for Open Media: new library

Martin Jansa (4):
      libhugetlbfs: revert one commit from 2.23 to work around build error on arm
      netkit-rsh: inherit update-alternatives
      ssmtp: adjust u-a
      utouch-*, ifenslave, iozone3, ttf-honkyfonts, python3-smbus: don't use trailing slash in S

Michael Vetter (3):
      jasper: use correct homepage
      jasper: upgrade 2.0.20 -> 2.0.21
      jasper: upgrade 2.0.21 -> 2.0.22

Mingli Yu (3):
      smartmontools: Remove obsolete setting regarding the Standard Output
      ippool: Remove obsolete setting in service file
      strongswan: Remove obsolete setting regarding the Standard Output

Naveen Saini (1):
      tbb: upgrade 2020.2 -> 2020.3

Pascal Bach (1):
      rocksdb: 6.6.4 -> 6.11.4

Pierre-Jean Texier (1):
      cppzmq: upgrade 4.6.0 -> 4.7.0

Ricardo Salveti (1):
      pcsc-lite: upgrade 1.8.26 -> 1.9.0

Richard Purdie (1):
      minifi-cpp: Adapt to potential psuedo changes

Robert Yang (1):
      crda: rdepends on wireless-regdb-static

Romain Naour (1):
      libiec61850: add recipe for libiec61850

Ross Burton (1):
      mpv: don't remove lua for aarch64 twice

Sakib Sajal (1):
      libssh2: enable ptest

Sinan Kaya (1):
      collectd: make rrdtool and rrdcached optional

Tim Orling (3):
      python3-markupsafe: bbappend for ptest
      python3-jinja2: bbappend for ptest
      packagegroup-meta-python: -jinja2 -markupsafe => ptest

Todd Cunningham (1):
      firewalld: upgrade 0.8.3 -> 0.9.0

Vladimir Zapolskiy (1):
      cifs-utils: remove explicitly set PV variable

Winfried Dobbe (1):
      firewalld: Add missing rdep on nftables-python

Yi Zhao (2):
      minifi-cpp: do not download source during compile
      minifi-cpp: set the default repositories location to /var/lib

Zang Ruochen (6):
      byacc: upgrade 20200330 -> 20200910
      memtester: upgrade 4.3.0 -> 4.4.0
      redis: upgrade 6.0.7 -> 6.0.8
      znc: upgrade 1.8.1 -> 1.8.2
      arno-iptables-firewall: upgrade 2.1.0 -> 2.1.1
      numactl: upgrade 2.0.13 -> 2.0.14

Zheng Ruoqin (1):
      dnf-plugin-tui: upgrade 1.1 -> 1.2

Zig Globulin (1):
      libuvc: add recipe

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: I67cbdcd31a7ead9641a4bce3477ff706f33bb253
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gedit/gedit_3.36.2.bb b/meta-openembedded/meta-gnome/recipes-gnome/gedit/gedit_3.36.2.bb
index afd9146..506bd11 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gedit/gedit_3.36.2.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gedit/gedit_3.36.2.bb
@@ -36,4 +36,5 @@
     ${PYTHON_SITEPACKAGES_DIR} \
 "
 
+RDEPENDS_${PN} += "gsettings-desktop-schemas"
 RRECOMMENDS_${PN} += "source-code-pro-fonts"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.7.bb b/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.8.bb
similarity index 87%
rename from meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.7.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.8.bb
index 58342b6..dbb04ef 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.7.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.58.8.bb
@@ -11,8 +11,7 @@
 
 inherit gnomebase gsettings gobject-introspection vala gettext features_check upstream-version-is-even
 
-SRC_URI[archive.md5sum] = "c8c530d4593133f496ae69098273a675"
-SRC_URI[archive.sha256sum] = "2014509019ea4e7a8ab8e0dd0c472bbcf0ad3067928af88c29f5e2879c58c7a9"
+SRC_URI[archive.sha256sum] = "7fb3eb746c17363d9ee47f4a5d0bb048f0075611763eb0da11d85e0e57aff381"
 SRC_URI += "file://0001-Disable-tests-on-host.patch"
 
 # gobject-introspection is mandatory and cannot be configured
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.5.bb b/meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.6.bb
similarity index 92%
rename from meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.5.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.6.bb
index fcdb2ae..a383da4 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.5.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.36.6.bb
@@ -16,7 +16,7 @@
 REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
 UNKNOWN_CONFIGURE_WHITELIST_append = " introspection"
 
-SRC_URI[archive.sha256sum] = "eea1242994109fa3f05793963ee25c3df23bc84b0f0b81f03ec3c294c27ab753"
+SRC_URI[archive.sha256sum] = "d23c76947c781f447fb39538dec509408b161b291a75a4ce1c14c2b3d33344f6"
 
 SRC_URI += " \
     file://gnome-desktop-thumbnail-don-t-assume-time_t-is-long.patch \
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gnome-settings-daemon/gnome-settings-daemon_3.36.1.bb b/meta-openembedded/meta-gnome/recipes-gnome/gnome-settings-daemon/gnome-settings-daemon_3.36.1.bb
index d14d6b5..e14891a 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gnome-settings-daemon/gnome-settings-daemon_3.36.1.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gnome-settings-daemon/gnome-settings-daemon_3.36.1.bb
@@ -55,5 +55,3 @@
     ${systemd_user_unitdir} \
     ${libdir}/gnome-settings-daemon-3.0/libgsd.so \
 "
-
-RDEPEND_${PN} += "gdbus"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.12.bb b/meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.13.bb
similarity index 84%
rename from meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.12.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.13.bb
index 0338455..fe6858f 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.12.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/grilo/grilo_0.3.13.bb
@@ -11,8 +11,7 @@
 
 inherit gnomebase gobject-introspection gtk-doc gettext vala
 
-SRC_URI[archive.md5sum] = "b464ce84db6f9354996a1d47b3c613da"
-SRC_URI[archive.sha256sum] = "dbfbd6082103288592af97568180b9cc81a336a274ed5160412f87675ec11a71"
+SRC_URI[archive.sha256sum] = "d14837f22341943ed8a189d9f0827a17016b802d18d0ed080e1413de0fdc927b"
 
 GIR_MESON_OPTION = "enable-introspection"
 GTKDOC_MESON_OPTION = "enable-gtk-doc"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.3.bb b/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.4.bb
similarity index 65%
rename from meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.3.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.4.bb
index 44cdefc..f7f493d 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.3.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.8.4.bb
@@ -7,5 +7,4 @@
 
 inherit gnomebase gettext gobject-introspection
 
-SRC_URI[archive.md5sum] = "d0892000d944e87fd74e8611ef400cdb"
-SRC_URI[archive.sha256sum] = "5ae514dd0216be069176accf6d0049d6a01cfa6a50df4bc06be85f7080b62de8"
+SRC_URI[archive.sha256sum] = "cf4d16a716e813449bd631405dc1001ea89537b8cdae2b8abfb3999212bd43b4"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.12.bb b/meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.13.bb
similarity index 87%
rename from meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.12.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.13.bb
index 9ce8bb8..de33fd8 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.12.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/libgdata/libgdata_0.17.13.bb
@@ -30,5 +30,4 @@
 
 EXTRA_OEMESON = "-Dalways_build_tests=false"
 
-SRC_URI[archive.md5sum] = "9d5692a2308bb949af801be66989e164"
-SRC_URI[archive.sha256sum] = "a0fd6f8820e8bae019c1f6ffab5af7fcd6d7f147915bb968b56df3ad61b42318"
+SRC_URI[archive.sha256sum] = "eab9ef792c3c2b9ece19d45aea15225aba8df2521bc12785b1b2d3318d8c472e"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.3.bb b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.5.bb
similarity index 92%
rename from meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.3.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.5.bb
index e2ced39..097bcdb 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.3.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker-miners_2.3.5.bb
@@ -15,8 +15,7 @@
 
 inherit gnomebase gsettings gobject-introspection vala gtk-doc manpages bash-completion features_check
 
-SRC_URI[archive.md5sum] = "a317bc50c5e63dd0746a48af478fb92b"
-SRC_URI[archive.sha256sum] = "7472aa28d7862620d3ca2bbec3b103df547d7319c12e95a7f7aa9f9f6dee4b19"
+SRC_URI[archive.sha256sum] = "9509d37fb29acd233058f4df5bd1234b692ac6f946bc2e5f7b8dbf51dfe5b9fa"
 SRC_URI += "file://0001-meson.build-Just-warn-if-we-build-without-libseccomp.patch"
 
 # gobject-introspection is mandatory and cannot be configured
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.4.bb b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.6.bb
similarity index 90%
rename from meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.4.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.6.bb
index b36e66b..2c11976 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.4.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_2.3.6.bb
@@ -22,8 +22,7 @@
 
 inherit gnomebase gsettings gobject-introspection vala gtk-doc manpages bash-completion features_check
 
-SRC_URI[archive.md5sum] = "9937cf4812ca85078907324c7cdf7dd8"
-SRC_URI[archive.sha256sum] = "577952244ab977c78b0b88e2f63c4197eaba16e4d66bff692b7f58993e06516d"
+SRC_URI[archive.sha256sum] = "bd1eb4122135296fa7b57b1c3fa0ed602cf7d06c0b8e534d0bd17ff5f97feef2"
 
 # gobject-introspection is mandatory and cannot be configured
 REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
diff --git a/meta-openembedded/meta-initramfs/recipes-devtools/mtd/ubi-utils-klibc_2.0.2.bb b/meta-openembedded/meta-initramfs/recipes-devtools/mtd/ubi-utils-klibc_2.0.2.bb
index 0475cbe..d322381 100644
--- a/meta-openembedded/meta-initramfs/recipes-devtools/mtd/ubi-utils-klibc_2.0.2.bb
+++ b/meta-openembedded/meta-initramfs/recipes-devtools/mtd/ubi-utils-klibc_2.0.2.bb
@@ -18,7 +18,7 @@
              file://0005-common.h-replace-getline-with-fgets.patch \
              "
 
-S = "${WORKDIR}/git/"
+S = "${WORKDIR}/git"
 
 EXTRA_OECONF += "--disable-tests --without-jffs --without-ubifs"
 
diff --git a/meta-openembedded/meta-multimedia/README b/meta-openembedded/meta-multimedia/README
index 3c4b1af..b4c2455 100644
--- a/meta-openembedded/meta-multimedia/README
+++ b/meta-openembedded/meta-multimedia/README
@@ -14,6 +14,6 @@
 When sending single patches, please use something like:
 'git send-email -M -1 --to openembedded-devel@lists.openembedded.org --subject-prefix=meta-multimedia][PATCH
 
-You are encouraged to fork the mirror on github https://github.com/openembedded/meta-oe/ to share your patches, this is preferred for patch sets consisting of more than one patch. Other services like gitorious, repo.or.cz or self hosted setups are of course accepted as well, 'git fetch <remote>' works the same on all of them. We recommend github because it is free, easy to use, has been proven to be reliable and has a really good web GUI.
+You are encouraged to fork the mirror on github https://github.com/openembedded/meta-openembedded to share your patches, this is preferred for patch sets consisting of more than one patch. Other services like GitLab, repo.or.cz or self hosted setups are of course accepted as well, 'git fetch <remote>' works the same on all of them. We recommend github because it is free, easy to use, has been proven to be reliable and has a really good web GUI.
 
 Layer maintainer: Andreas Müller <schnitzeltony@gmail.com>
diff --git a/meta-openembedded/meta-multimedia/licenses/AOM-Patent-License-1.0 b/meta-openembedded/meta-multimedia/licenses/AOM-Patent-License-1.0
new file mode 100644
index 0000000..493f616
--- /dev/null
+++ b/meta-openembedded/meta-multimedia/licenses/AOM-Patent-License-1.0
@@ -0,0 +1,108 @@
+Alliance for Open Media Patent License 1.0
+
+1. License Terms.
+
+1.1. Patent License. Subject to the terms and conditions of this License, each
+     Licensor, on behalf of itself and successors in interest and assigns,
+     grants Licensee a non-sublicensable, perpetual, worldwide, non-exclusive,
+     no-charge, royalty-free, irrevocable (except as expressly stated in this
+     License) patent license to its Necessary Claims to make, use, sell, offer
+     for sale, import or distribute any Implementation.
+
+1.2. Conditions.
+
+1.2.1. Availability. As a condition to the grant of rights to Licensee to make,
+       sell, offer for sale, import or distribute an Implementation under
+       Section 1.1, Licensee must make its Necessary Claims available under
+       this License, and must reproduce this License with any Implementation
+       as follows:
+
+       a. For distribution in source code, by including this License in the
+          root directory of the source code with its Implementation.
+
+       b. For distribution in any other form (including binary, object form,
+          and/or hardware description code (e.g., HDL, RTL, Gate Level Netlist,
+          GDSII, etc.)), by including this License in the documentation, legal
+          notices, and/or other written materials provided with the
+          Implementation.
+
+1.2.2. Additional Conditions. This license is directly from Licensor to
+       Licensee.  Licensee acknowledges as a condition of benefiting from it
+       that no rights from Licensor are received from suppliers, distributors,
+       or otherwise in connection with this License.
+
+1.3. Defensive Termination. If any Licensee, its Affiliates, or its agents
+     initiates patent litigation or files, maintains, or voluntarily
+     participates in a lawsuit against another entity or any person asserting
+     that any Implementation infringes Necessary Claims, any patent licenses
+     granted under this License directly to the Licensee are immediately
+     terminated as of the date of the initiation of action unless 1) that suit
+     was in response to a corresponding suit regarding an Implementation first
+     brought against an initiating entity, or 2) that suit was brought to
+     enforce the terms of this License (including intervention in a third-party
+     action by a Licensee).
+
+1.4. Disclaimers. The Reference Implementation and Specification are provided
+     "AS IS" and without warranty. The entire risk as to implementing or
+     otherwise using the Reference Implementation or Specification is assumed
+     by the implementer and user. Licensor expressly disclaims any warranties
+     (express, implied, or otherwise), including implied warranties of
+     merchantability, non-infringement, fitness for a particular purpose, or
+     title, related to the material. IN NO EVENT WILL LICENSOR BE LIABLE TO
+     ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL,
+     INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF
+     ACTION OF ANY KIND WITH RESPECT TO THIS LICENSE, WHETHER BASED ON BREACH
+     OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR
+     NOT THE OTHER PARTRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+2. Definitions.
+
+2.1. Affiliate.  "Affiliate" means an entity that directly or indirectly
+     Controls, is Controlled by, or is under common Control of that party.
+
+2.2. Control. "Control" means direct or indirect control of more than 50% of
+     the voting power to elect directors of that corporation, or for any other
+     entity, the power to direct management of such entity.
+
+2.3. Decoder.  "Decoder" means any decoder that conforms fully with all
+     non-optional portions of the Specification.
+
+2.4. Encoder.  "Encoder" means any encoder that produces a bitstream that can
+     be decoded by a Decoder only to the extent it produces such a bitstream.
+
+2.5. Final Deliverable.  "Final Deliverable" means the final version of a
+     deliverable approved by the Alliance for Open Media as a Final
+     Deliverable.
+
+2.6. Implementation.  "Implementation" means any implementation, including the
+     Reference Implementation, that is an Encoder and/or a Decoder. An
+     Implementation also includes components of an Implementation only to the
+     extent they are used as part of an Implementation.
+
+2.7. License. "License" means this license.
+
+2.8. Licensee. "Licensee" means any person or entity who exercises patent
+     rights granted under this License.
+
+2.9. Licensor.  "Licensor" means (i) any Licensee that makes, sells, offers
+     for sale, imports or distributes any Implementation, or (ii) a person
+     or entity that has a licensing obligation to the Implementation as a
+     result of its membership and/or participation in the Alliance for Open
+     Media working group that developed the Specification.
+
+2.10. Necessary Claims.  "Necessary Claims" means all claims of patents or
+      patent applications, (a) that currently or at any time in the future,
+      are owned or controlled by the Licensor, and (b) (i) would be an
+      Essential Claim as defined by the W3C Policy as of February 5, 2004
+      (https://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential)
+      as if the Specification was a W3C Recommendation; or (ii) are infringed
+      by the Reference Implementation.
+
+2.11. Reference Implementation. "Reference Implementation" means an Encoder
+      and/or Decoder released by the Alliance for Open Media as a Final
+      Deliverable.
+
+2.12. Specification. "Specification" means the specification designated by
+      the Alliance for Open Media as a Final Deliverable for which this
+      License was issued.
+
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/aom/aom_2.0.0.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/aom/aom_2.0.0.bb
new file mode 100644
index 0000000..c5ad1f8
--- /dev/null
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/aom/aom_2.0.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Alliance for Open Media - AV1 Codec Library"
+DESCRIPTION = "Alliance for Open Media AV1 codec library"
+
+LICENSE = "BSD-2-Clause & AOM-Patent-1.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6ea91368c1bbdf877159435572b931f5 \
+                    file://PATENTS;md5=e69ad12202bd20da3c76a5d3648cfa83 \
+                   "
+
+SRC_URI = "git://aomedia.googlesource.com/aom;protocol=https"
+
+SRCREV = "d1d1226af626a61f7ca664b270dd473b92228984"
+
+S = "${WORKDIR}/git"
+
+inherit cmake pkgconfig
+DEPENDS = " yasm-native"
+
+EXTRA_OECMAKE = " -DBUILD_SHARED_LIBS=1 -DENABLE_TESTS=0 \
+                  -DPERL_EXECUTABLE=${HOSTTOOLS_DIR}/perl \
+                "
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/libuvc/libuvc.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/libuvc/libuvc.bb
new file mode 100644
index 0000000..4d301fb
--- /dev/null
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/libuvc/libuvc.bb
@@ -0,0 +1,14 @@
+SUMMARY = "library for USB video devices built atop libusb"
+HOMEPAGE = "https://github.com/libuvc/libuvc.git"
+SECTION = "libs"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2f1963e0bb88c93463af750daf9ba0c2"
+DEPENDS = "libusb jpeg"
+
+SRC_URI = "git://github.com/libuvc/libuvc.git"
+SRCREV = "ad6c72a4e390367f0d2be81aac00cfc0b6680d74"
+PV = "v0.0.6+git${SRCPV}"
+
+S = "${WORKDIR}/git"
+
+inherit cmake
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
index 2bf8877..c9db21a 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
@@ -21,6 +21,7 @@
 
 RDEPENDS_packagegroup-meta-multimedia = "\
     alsa-equal \
+    aom \
     caps \
     cdparanoia \
     dcadec \
@@ -60,6 +61,7 @@
     vorbis-tools \
     libdvbcsa \
     libopenmpt \
+    libuvc \
     mimic \
     ${@bb.utils.contains("LICENSE_FLAGS_WHITELIST", "commercial", "minidlna", "", d)} \
     mycroft \
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.1.bb
similarity index 98%
rename from meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.bb
rename to meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.1.bb
index dd9486e..44178a1 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/vlc/vlc_3.0.11.1.bb
@@ -25,7 +25,7 @@
            file://0004-Use-packageconfig-to-detect-mmal-support.patch \
            file://0005-Fix-build-with-Qt-5.15.patch \
 "
-SRC_URI[sha256sum] = "3e94a1acf33445e9da15d528aa48657aa26b912eaa2656b403d43860a8834919"
+SRC_URI[sha256sum] = "189311d28aa814f106a7b3645211ac52c0b3e2b9f4b348de2f63bab3218086b8"
 
 inherit autotools features_check gettext pkgconfig mime-xdg
 
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/crda/crda_3.18.bb b/meta-openembedded/meta-networking/recipes-connectivity/crda/crda_3.18.bb
index b380eaf..e59d2f4 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/crda/crda_3.18.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/crda/crda_3.18.bb
@@ -35,4 +35,4 @@
     oe_runmake SBINDIR=${sbindir}/ install
 }
 
-RDEPENDS_${PN} = "udev wireless-regdb"
+RDEPENDS_${PN} = "udev wireless-regdb-static"
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.8.3.bb b/meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.9.0.bb
similarity index 96%
rename from meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.8.3.bb
rename to meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.9.0.bb
index ddf5ff8..a768776 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.8.3.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/firewalld/firewalld_0.9.0.bb
@@ -8,7 +8,7 @@
 SRC_URI = "https://github.com/${BPN}/${BPN}/releases/download/v${PV}/${BP}.tar.gz \
            file://firewalld.init \
 "
-SRC_URI[sha256sum] = "4ecb16d82c2825ccfb8f109e543c0492cf6ea8c43e2d0f59901bddcead037dc6"
+SRC_URI[sha256sum] = "7cfbf8a33f726151e60c07486af0921fa05cbbab097adf90ec1caef37b49d9a0"
 
 # glib-2.0-native is needed for GSETTINGS_RULES autoconf macro from gsettings.m4
 DEPENDS = "intltool-native glib-2.0-native"
@@ -87,4 +87,5 @@
     python3-slip-dbus \
     python3-decorator \
     python3-pygobject \
+    nftables-python \
 "
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0001-use-poll.h-instead-of-sys-poll.h.patch b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0001-use-poll.h-instead-of-sys-poll.h.patch
new file mode 100644
index 0000000..a04473d
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0001-use-poll.h-instead-of-sys-poll.h.patch
@@ -0,0 +1,33 @@
+From 4cad505fc98240eb66eaabfae61a9694f8158dda Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@smile.fr>
+Date: Tue, 7 Apr 2020 20:58:37 +0200
+Subject: [PATCH] use <poll.h> instead of <sys/poll.h>
+
+The manpage of poll(2) states that the prototype of poll is defined
+in <poll.h>. Use that header file instead of <sys/poll.h> to allow
+compilation against musl-libc.
+
+Upstream status: Pending
+https://github.com/mz-automation/libiec61850/pull/228
+
+Signed-off-by: Romain Naour <romain.naour@smile.fr>
+---
+ hal/ethernet/linux/ethernet_linux.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/hal/ethernet/linux/ethernet_linux.c b/hal/ethernet/linux/ethernet_linux.c
+index c3ab2e2..9aa5c28 100644
+--- a/hal/ethernet/linux/ethernet_linux.c
++++ b/hal/ethernet/linux/ethernet_linux.c
+@@ -23,7 +23,7 @@
+ 
+ #include <sys/socket.h>
+ #include <sys/ioctl.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <linux/if_packet.h>
+ #include <linux/if_ether.h>
+ #include <linux/if_arp.h>
+-- 
+2.21.1
+
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0002-serial_port_linux-Add-missing-include-sys-time.h.patch b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0002-serial_port_linux-Add-missing-include-sys-time.h.patch
new file mode 100644
index 0000000..e1b8ca1
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0002-serial_port_linux-Add-missing-include-sys-time.h.patch
@@ -0,0 +1,32 @@
+From 661405eb6066b67dfe51d5ff9635e29f86bdd238 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@smile.fr>
+Date: Tue, 7 Apr 2020 21:02:54 +0200
+Subject: [PATCH] serial_port_linux: Add missing include sys/time.h
+
+POSIX says `struct timeval` is defined if <sys/time.h> is included.
+
+Adding this header allow to build against musl-libc.
+
+Upstream status: Pending
+https://github.com/mz-automation/libiec61850/pull/228
+
+Signed-off-by: Romain Naour <romain.naour@smile.fr>
+---
+ hal/serial/linux/serial_port_linux.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/hal/serial/linux/serial_port_linux.c b/hal/serial/linux/serial_port_linux.c
+index e6308c0..15e5794 100644
+--- a/hal/serial/linux/serial_port_linux.c
++++ b/hal/serial/linux/serial_port_linux.c
+@@ -29,6 +29,7 @@
+ #include <termios.h>
+ #include <fcntl.h>
+ #include <unistd.h>
++#include <sys/time.h>
+ 
+ #include "hal_serial.h"
+ #include "hal_time.h"
+-- 
+2.21.1
+
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0003-pyiec61850-don-t-break-CMAKE_INSTALL_PATH-by-trying-.patch b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0003-pyiec61850-don-t-break-CMAKE_INSTALL_PATH-by-trying-.patch
new file mode 100644
index 0000000..6556761
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/files/0003-pyiec61850-don-t-break-CMAKE_INSTALL_PATH-by-trying-.patch
@@ -0,0 +1,37 @@
+From 89f326a427c7ad13c115e2d3f2ac27807aa5a795 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@smile.fr>
+Date: Fri, 10 Jul 2020 17:08:34 +0200
+Subject: [PATCH] pyiec61850: don't break CMAKE_INSTALL_PATH by trying to find
+ python modules install path (site-packages)
+
+https://stackoverflow.com/questions/1242904/finding-python-site-packages-directory-with-cmake
+
+Signed-off-by: Romain Naour <romain.naour@smile.fr>
+---
+ pyiec61850/CMakeLists.txt | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/pyiec61850/CMakeLists.txt b/pyiec61850/CMakeLists.txt
+index 159ef4b..d1732a1 100644
+--- a/pyiec61850/CMakeLists.txt
++++ b/pyiec61850/CMakeLists.txt
+@@ -31,14 +31,7 @@ endif()
+ 
+ swig_link_libraries(iec61850 ${PYTHON_LIBRARIES} ${LIBS})
+ 
+-# Finding python modules install path
+-execute_process(
+-	COMMAND ${PYTHON_EXECUTABLE} -c
+-	"from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib())"
+-	OUTPUT_VARIABLE PYTHON_SITE_DIR
+-)
+-
+-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iec61850.py DESTINATION ${PYTHON_SITE_DIR})
+-install(TARGETS _iec61850 LIBRARY DESTINATION ${PYTHON_SITE_DIR})
++install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iec61850.py DESTINATION /usr/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
++install(TARGETS _iec61850 LIBRARY DESTINATION /usr/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
+ 
+ add_test(test_pyiec61850 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/test_pyiec61850.py)
+-- 
+2.21.3
+
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/libiec61850_1.4.2.1.bb b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/libiec61850_1.4.2.1.bb
new file mode 100644
index 0000000..18cb0cd
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-connectivity/libiec61850/libiec61850_1.4.2.1.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Open source iec61850 implementation"
+DESCRIPTION = "IEC 61850 is an international standard for \
+communication systems in Substation Automation Systems \
+(SAS) and management of Decentralized Energy Resources \
+(DER). It is seen as one of the communication standards \
+of the emerging Smart Grid. \
+The project libIEC61850 provides a server and client \
+library for the IEC 61850/MMS, IEC 61850/GOOSE and IEC \
+61850-9-2/Sampled Values communication protocols \
+written in C. It is available under the GPLv3 license."
+HOMEPAGE = "http://libiec61850.com"
+SECTION = "console/network"
+LICENSE = "GPLv3"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
+DEPENDS = "swig-native python3"
+SRCREV = "d798814fb463115a835da597535a625b68a39cff"
+
+SRC_URI = "git://github.com/mz-automation/${BPN}.git;branch=v1.4 \
+           file://0001-use-poll.h-instead-of-sys-poll.h.patch \
+           file://0002-serial_port_linux-Add-missing-include-sys-time.h.patch \
+           file://0003-pyiec61850-don-t-break-CMAKE_INSTALL_PATH-by-trying-.patch \
+"
+
+S = "${WORKDIR}/git"
+
+inherit cmake pkgconfig python3-dir python3native siteinfo
+
+EXTRA_OECMAKE = " \
+    -DBUILD_EXAMPLES=OFF \
+    -DBUILD_PYTHON_BINDINGS=ON \
+"
+
+RDEPENDS_${PN}-python = " python3-core "
+RDEPENDS_${PN} = " python3-core "
+
+FILES_${PN} += " \
+    ${libdir}/${PYTHON_DIR}/site-packages/iec61850.py \
+    ${libdir}/${PYTHON_DIR}/site-packages/_iec61850.so \
+"
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl/0001-Make-ByteReverseWords-available-for-big-and-little-e.patch b/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl/0001-Make-ByteReverseWords-available-for-big-and-little-e.patch
new file mode 100644
index 0000000..4676769
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl/0001-Make-ByteReverseWords-available-for-big-and-little-e.patch
@@ -0,0 +1,32 @@
+From b90acc91d0cd276befe7f08f87ba2dc5ee7122ff Mon Sep 17 00:00:00 2001
+From: Tesfa Mael <tesfa@wolfssl.com>
+Date: Wed, 26 Aug 2020 10:13:06 -0700
+Subject: [PATCH] Make ByteReverseWords available for big and little endian
+
+---
+ wolfcrypt/src/misc.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/wolfcrypt/src/misc.c b/wolfcrypt/src/misc.c
+index fe66ee0a1..23bfa1adc 100644
+--- a/wolfcrypt/src/misc.c
++++ b/wolfcrypt/src/misc.c
+@@ -120,7 +120,6 @@ WC_STATIC WC_INLINE word32 ByteReverseWord32(word32 value)
+     return rotlFixed(value, 16U);
+ #endif
+ }
+-#if defined(LITTLE_ENDIAN_ORDER)
+ /* This routine performs a byte swap of words array of a given count. */
+ WC_STATIC WC_INLINE void ByteReverseWords(word32* out, const word32* in,
+                                     word32 byteCount)
+@@ -131,7 +130,6 @@ WC_STATIC WC_INLINE void ByteReverseWords(word32* out, const word32* in,
+         out[i] = ByteReverseWord32(in[i]);
+ 
+ }
+-#endif /* LITTLE_ENDIAN_ORDER */
+ 
+ #if defined(WORD64_AVAILABLE) && !defined(WOLFSSL_NO_WORD64_OPS)
+ 
+-- 
+2.25.1
+
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.4.0.bb b/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.5.0.bb
similarity index 77%
rename from meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.4.0.bb
rename to meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.5.0.bb
index db7b0d4..61cf1cc 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.4.0.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/wolfssl/wolfssl_4.5.0.bb
@@ -12,8 +12,10 @@
 PROVIDES += "cyassl"
 RPROVIDES_${PN} = "cyassl"
 
-SRC_URI = "git://github.com/wolfSSL/wolfssl.git;protocol=https"
-SRCREV = "e116c89a58af750421d82ece13f80516d2bde02e"
+SRC_URI = "git://github.com/wolfSSL/wolfssl.git;protocol=https \
+           file://0001-Make-ByteReverseWords-available-for-big-and-little-e.patch \
+"
+SRCREV = "0fa5af9929ce2ee99e8789996a3048f41a99830e"
 S = "${WORKDIR}/git"
 
 inherit autotools
diff --git a/meta-openembedded/meta-networking/recipes-daemons/ippool/ippool/ippool.service b/meta-openembedded/meta-networking/recipes-daemons/ippool/ippool/ippool.service
index e5917fc..281ae5f 100644
--- a/meta-openembedded/meta-networking/recipes-daemons/ippool/ippool/ippool.service
+++ b/meta-openembedded/meta-networking/recipes-daemons/ippool/ippool/ippool.service
@@ -9,7 +9,6 @@
 ExecStart=@SBINDIR@/ippoold -f
 # Normal output will go to syslog, so suppress stdout.
 StandardOutput=null
-StandardError=syslog
 # ExecStop is not needed. systemd will send SIGTERM
 # and ippoold will exit status 1.
 SuccessExitStatus=1
diff --git a/meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.0.bb b/meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.1.bb
similarity index 96%
rename from meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.0.bb
rename to meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.1.bb
index 115353f..bc9297e 100644
--- a/meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.0.bb
+++ b/meta-openembedded/meta-networking/recipes-filter/arno-iptables-firewall/arno-iptables-firewall_2.1.1.bb
@@ -4,7 +4,7 @@
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://gpl_license.txt;md5=11c7b65c4a4acb9d5175f7e9bf99c403"
 
-SRCREV = "39276d14b659684c4c0612725ab83ea841c6ef99"
+SRCREV = "a96b81da4a9b619e4045805f5f13a1e982c95663"
 SRC_URI = "git://github.com/arno-iptables-firewall/aif"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.1.bb b/meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.2.bb
similarity index 94%
rename from meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.1.bb
rename to meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.2.bb
index c54e617..806d622 100644
--- a/meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.1.bb
+++ b/meta-openembedded/meta-networking/recipes-irc/znc/znc_1.8.2.bb
@@ -8,7 +8,7 @@
 SRC_URI = "git://github.com/znc/znc.git;name=znc \
            git://github.com/jimloco/Csocket.git;destsuffix=git/third_party/Csocket;name=Csocket \
           "
-SRCREV_znc = "0a3909beaa15e0da499473d6d041e5b75c14e885"
+SRCREV_znc = "bf253640d33d03331310778e001fb6f5aba2989e"
 SRCREV_Csocket = "e8d9e0bb248c521c2c7fa01e1c6a116d929c41b4"
 
 # This constructs a composite revision based on multiple SRCREV's.
diff --git a/meta-openembedded/meta-networking/recipes-netkit/netkit-rsh/netkit-rsh_0.17.bb b/meta-openembedded/meta-networking/recipes-netkit/netkit-rsh/netkit-rsh_0.17.bb
index f6c05da..70fb4cf 100644
--- a/meta-openembedded/meta-networking/recipes-netkit/netkit-rsh/netkit-rsh_0.17.bb
+++ b/meta-openembedded/meta-networking/recipes-netkit/netkit-rsh/netkit-rsh_0.17.bb
@@ -31,7 +31,7 @@
 "
 SRC_URI += "${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)}"
 
-inherit pkgconfig
+inherit pkgconfig update-alternatives
 
 CFLAGS += " -D_GNU_SOURCE -Wno-deprecated-declarations"
 LDFLAGS += " -L${STAGING_LIBDIR} -lutil -lcrypt"
diff --git a/meta-openembedded/meta-networking/recipes-support/cifs/cifs-utils_6.11.bb b/meta-openembedded/meta-networking/recipes-support/cifs/cifs-utils_6.11.bb
index 09b7931..de3fbb0 100644
--- a/meta-openembedded/meta-networking/recipes-support/cifs/cifs-utils_6.11.bb
+++ b/meta-openembedded/meta-networking/recipes-support/cifs/cifs-utils_6.11.bb
@@ -4,8 +4,6 @@
 LICENSE = "GPLv3 & LGPLv3"
 LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
 
-PV = "6.10"
-
 SRCREV = "ded4e81796a18cde73329e838357f084aa05720f"
 SRC_URI = "git://git.samba.org/cifs-utils.git"
 
diff --git a/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.11.bb b/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.11.bb
index 72a7eee..0db9e8a 100644
--- a/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.11.bb
+++ b/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.11.bb
@@ -11,7 +11,7 @@
 SRCREV = "c26e9310f552e69d0d44eb48746e02c9ae4b4f6f"
 SRC_URI = "git://salsa.debian.org/debian/ifenslave.git;protocol=https"
 
-S = "${WORKDIR}/git/"
+S = "${WORKDIR}/git"
 
 do_install() {
     install -m 0755 -D ${S}/debian/ifenslave.if-pre-up ${D}${sysconfdir}/network/if-pre-up.d/ifenslave
diff --git a/meta-openembedded/meta-networking/recipes-support/ssmtp/ssmtp_2.64.bb b/meta-openembedded/meta-networking/recipes-support/ssmtp/ssmtp_2.64.bb
index 3739c49..bae29aa 100644
--- a/meta-openembedded/meta-networking/recipes-support/ssmtp/ssmtp_2.64.bb
+++ b/meta-openembedded/meta-networking/recipes-support/ssmtp/ssmtp_2.64.bb
@@ -36,13 +36,7 @@
 
 ALTERNATIVE_PRIORITY_${PN} = "100"
 
-ALTERNATIVE_${PN} = "mailq newalias sendmail"
+ALTERNATIVE_${PN} = "mailq newaliases sendmail"
 ALTERNATIVE_LINK_NAME[sendmail] = "${sbindir}/sendmail"
-ALTERNATIVE_LINK_NAME[newalias] = "${sbindir}/newalias"
+ALTERNATIVE_LINK_NAME[newaliases] = "${sbindir}/newaliases"
 ALTERNATIVE_LINK_NAME[mailq] = "${sbindir}/mailq"
-
-ALTERNATIVE_PRIORITY_${PN}-doc = "100"
-ALTERNATIVE_${PN}-doc += "mailq.1 newaliases.1 sendmail.1"
-ALTERNATIVE_LINK_NAME[mailq.1] = "${mandir}/man1/mailq.1"
-ALTERNATIVE_LINK_NAME[newaliases.1] = "${mandir}/man1/newaliases.1"
-ALTERNATIVE_LINK_NAME[sendmail.1] = "${mandir}/man1/sendmail.1"
diff --git a/meta-openembedded/meta-networking/recipes-support/strongswan/files/0001-Remove-obsolete-setting-regarding-the-Standard-Outpu.patch b/meta-openembedded/meta-networking/recipes-support/strongswan/files/0001-Remove-obsolete-setting-regarding-the-Standard-Outpu.patch
new file mode 100644
index 0000000..78adcf8
--- /dev/null
+++ b/meta-openembedded/meta-networking/recipes-support/strongswan/files/0001-Remove-obsolete-setting-regarding-the-Standard-Outpu.patch
@@ -0,0 +1,34 @@
+From 7b1e376d7d22244feab466e9889ba77561117357 Mon Sep 17 00:00:00 2001
+From: Mingli Yu <mingli.yu@windriver.com>
+Date: Wed, 23 Sep 2020 16:20:22 +0800
+Subject: [PATCH] Remove obsolete setting regarding the Standard Output
+
+The Standard output type "syslog" is obsolete, causing a warning since systemd
+version 246 [1].
+
+Please consider using "journal" or "journal+console"
+
+[1] https://github.com/systemd/systemd/blob/master/NEWS#L202
+
+Upstream-Status: Submitted [https://github.com/strongswan/strongswan/pull/181]
+
+Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
+---
+ init/systemd-starter/strongswan-starter.service.in | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/init/systemd-starter/strongswan-starter.service.in b/init/systemd-starter/strongswan-starter.service.in
+index 474284a19..6a0672352 100644
+--- a/init/systemd-starter/strongswan-starter.service.in
++++ b/init/systemd-starter/strongswan-starter.service.in
+@@ -4,7 +4,6 @@ After=syslog.target network-online.target
+ 
+ [Service]
+ ExecStart=@SBINDIR@/@IPSEC_SCRIPT@ start --nofork
+-StandardOutput=syslog
+ Restart=on-abnormal
+ 
+ [Install]
+-- 
+2.17.1
+
diff --git a/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.8.4.bb b/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.8.4.bb
index 0a27331..8a88092 100644
--- a/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.8.4.bb
+++ b/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.8.4.bb
@@ -10,6 +10,7 @@
 SRC_URI = "http://download.strongswan.org/strongswan-${PV}.tar.bz2 \
            file://fix-funtion-parameter.patch \
            file://0001-memory.h-Include-stdint.h-for-uintptr_t.patch \
+           file://0001-Remove-obsolete-setting-regarding-the-Standard-Outpu.patch \
            "
 
 SRC_URI[md5sum] = "0634e7f40591bd3f6770e583c3f27d29"
diff --git a/meta-openembedded/meta-oe/README b/meta-openembedded/meta-oe/README
index 6a0d7c0..8d787df 100644
--- a/meta-openembedded/meta-oe/README
+++ b/meta-openembedded/meta-oe/README
@@ -19,10 +19,10 @@
 When sending single patches, please use something like:
 'git send-email -M -1 --to openembedded-devel@lists.openembedded.org --subject-prefix="meta-oe][PATCH"'
 
-You are encouraged to fork the mirror on GitHub https://github.com/openembedded/openembedded-core
+You are encouraged to fork the mirror on GitHub https://github.com/openembedded/meta-openembedded
 to share your patches, this is preferred for patch sets consisting of more than one patch.
 
-Other services like gitorious, repo.or.cz or self-hosted setups are of course accepted as well,
+Other services like GitLab, repo.or.cz or self-hosted setups are of course accepted as well,
 'git fetch <remote>' works the same on all of them. We recommend GitHub because it is free, easy
 to use, has been proven to be reliable and has a really good web GUI.
 
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/iozone3/iozone3_490.bb b/meta-openembedded/meta-oe/recipes-benchmark/iozone3/iozone3_490.bb
index ecf08cb..1d2e53a 100644
--- a/meta-openembedded/meta-oe/recipes-benchmark/iozone3/iozone3_490.bb
+++ b/meta-openembedded/meta-oe/recipes-benchmark/iozone3/iozone3_490.bb
@@ -16,7 +16,7 @@
 
 UPSTREAM_CHECK_REGEX = "iozone3_(?P<pver>\d+).tar"
 
-S = "${WORKDIR}/${BPN}_${PV}/src/current/"
+S = "${WORKDIR}/${BPN}_${PV}/src/current"
 
 #
 # All other arches can use the default OEMAKE except those
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/files/0001-Revert-ld.hugetlbfs-fix-Ttext-segment-argument-on-AA.patch b/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/files/0001-Revert-ld.hugetlbfs-fix-Ttext-segment-argument-on-AA.patch
new file mode 100644
index 0000000..0787ef2
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/files/0001-Revert-ld.hugetlbfs-fix-Ttext-segment-argument-on-AA.patch
@@ -0,0 +1,210 @@
+From 0a163f60b4a316c4b6f1726a71c84755f3bd85e7 Mon Sep 17 00:00:00 2001
+From: Martin Jansa <martin.jansa@lge.com>
+Date: Wed, 16 Sep 2020 04:36:04 -0700
+Subject: [PATCH] Revert "ld.hugetlbfs: fix -Ttext-segment argument on AArch64"
+
+This reverts commit 852dcc963ce44861ed7c4e225aa92ff2b5b43579.
+
+* works around
+  ERROR: libhugetlbfs-1_2.23-r0 do_populate_sysroot: Fatal errors occurred in subprocesses:
+  Command '['arm-oe-linux-gnueabi-strip', '--remove-section=.comment', '--remove-section=.note', 'libhugetlbfs/1_2.23-r0/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/linkhuge_rw']' returned non-zero exit status 1.
+  Subprocess output:arm-oe-linux-gnueabi-strip:
+  libhugetlbfs/1_2.23-r0/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/stmuFa58: error: PHDR segment not covered by LOAD segment
+  arm-oe-linux-gnueabi-strip: libhugetlbfs/1_2.23-r0/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/stmuFa58[.interp]: file format not recognized
+
+I don't see anything suspicious in the build (the same cmdline as in 2.22
+version), but it uses
+
+libhugetlbfs/1_2.22-r0-old/temp/log.do_compile:arm-oe-linux-gnueabi-gcc
+ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -Wl,-O1
+-Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security
+-Werror=format-security -Werror=return-type
+--sysroot=/jenkins/mjansa/build/ros/oe-melodic-gatesgarth/libhugetlbfs/1_2.22-r0/recipe-sysroot
+-I.. -O2 -Wall -g -o obj32/linkhuge_rw.o -c linkhuge_rw.c
+libhugetlbfs/1_2.22-r0-old/temp/log.do_compile:arm-oe-linux-gnueabi-gcc
+ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -Wl,-O1
+-Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security
+-Werror=format-security -Werror=return-type
+--sysroot=/jenkins/mjansa/build/ros/oe-melodic-gatesgarth/libhugetlbfs/1_2.22-r0/recipe-sysroot
+-B./obj32 -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-ldl -L../obj32 -o obj32/linkhuge_rw -Wl,--no-as-needed -lpthread -ldl
+-lhugetlbfs_privutils -Wl,--hugetlbfs-align obj32/linkhuge_rw.o
+obj32/testutils.o
+libhugetlbfs/1_2.23-r0-new/temp/log.do_compile:arm-oe-linux-gnueabi-gcc
+ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -Wl,-O1
+-Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security
+-Werror=format-security -Werror=return-type
+--sysroot=/jenkins/mjansa/build/ros/oe-melodic-gatesgarth/libhugetlbfs/1_2.23-r0/recipe-sysroot
+-I.. -O2 -Wall -g -o obj32/linkhuge_rw.o -c linkhuge_rw.c
+libhugetlbfs/1_2.23-r0-new/temp/log.do_compile:arm-oe-linux-gnueabi-gcc
+ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -Wl,-O1
+-Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security
+-Werror=format-security -Werror=return-type
+--sysroot=/jenkins/mjansa/build/ros/oe-melodic-gatesgarth/libhugetlbfs/1_2.23-r0/recipe-sysroot
+-B./obj32 -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now
+-ldl -L../obj32 -o obj32/linkhuge_rw -Wl,--no-as-needed -lpthread -ldl
+-lhugetlbfs_privutils -Wl,--hugetlbfs-align obj32/linkhuge_rw.o
+obj32/testutils.o
+
+And the git log between 2.22 and 2.23 is also very short and looks
+reasonable.
+https://github.com/libhugetlbfs/libhugetlbfs/compare/2.22...2.23
+
+When checking with readelf -l it also shows the error about PHDR segment:
+arm-oe-linux-gnueabi-readelf -l
+./1_2.22-r0-old/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/linkhuge_rw
+
+Elf file type is DYN (Shared object file)
+Entry point 0x201105
+There are 10 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  PHDR           0x000034 0x00200034 0x00200034 0x00140 0x00140 R   0x4
+  INTERP         0x000174 0x00200174 0x00200174 0x0001d 0x0001d R   0x1
+      [Requesting program interpreter: /usr/lib/ld-linux-armhf.so.3]
+  LOAD           0x000000 0x00200000 0x00200000 0x1222c 0x1222c R E 0x200000
+  LOAD           0x1ffdf0 0x005ffdf0 0x005ffdf0 0x102e0 0x202ec RW  0x200000
+  DYNAMIC        0x1ffdf8 0x005ffdf8 0x005ffdf8 0x00128 0x00128 RW  0x4
+  NOTE           0x000194 0x00200194 0x00200194 0x00044 0x00044 R   0x4
+  GNU_EH_FRAME   0x012224 0x00212224 0x00212224 0x00008 0x00008 R   0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
+  EXIDX          0x001c5c 0x00201c5c 0x00201c5c 0x00008 0x00008 R   0x4
+  GNU_RELRO      0x1ffdf0 0x005ffdf0 0x005ffdf0 0x00210 0x00210 RW  0x4
+
+ Section to Segment mapping:
+  Segment Sections...
+   00
+   01     .interp
+   02     .interp .note.ABI-tag .note.gnu.build-id .dynsym .dynstr
+.gnu.hash .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text
+.fini .ARM.extab .ARM.exidx .rodata .eh_frame .eh_frame_hdr
+   03     .fini_array .init_array .dynamic .got .data .bss
+   04     .dynamic
+   05     .note.ABI-tag .note.gnu.build-id
+   06     .eh_frame_hdr
+   07
+   08     .ARM.extab .ARM.exidx
+   09     .fini_array .init_array .dynamic .got
+
+arm-oe-linux-gnueabi-readelf -l
+./1_2.23-r0-new/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/linkhuge_rw
+
+Elf file type is DYN (Shared object file)
+Entry point 0x31cd1
+There are 10 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  PHDR           0x000000 0x00000000 0x00000000 0x00000 0x00000 R   0
+readelf: Error: the PHDR segment is not covered by a LOAD segment
+  INTERP         0x030d40 0x00030d40 0x00030d40 0x0001d 0x0001d R   0x1
+      [Requesting program interpreter: /usr/lib/ld-linux-armhf.so.3]
+  LOAD           0x030d40 0x00030d40 0x00030d40 0x120b8 0x120b8 R E 0x200000
+  LOAD           0x1ffdf0 0x003ffdf0 0x003ffdf0 0x102e0 0x202ec RW  0x200000
+  DYNAMIC        0x1ffdf8 0x003ffdf8 0x003ffdf8 0x00128 0x00128 RW  0x4
+  NOTE           0x030d60 0x00030d60 0x00030d60 0x00044 0x00044 R   0x4
+  GNU_EH_FRAME   0x042df0 0x00042df0 0x00042df0 0x00008 0x00008 R   0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
+  EXIDX          0x032828 0x00032828 0x00032828 0x00008 0x00008 R   0x4
+  GNU_RELRO      0x1ffdf0 0x003ffdf0 0x003ffdf0 0x00210 0x00210 RW  0x4
+
+ Section to Segment mapping:
+  Segment Sections...
+   00
+   01     .interp
+   02     .interp .note.ABI-tag .note.gnu.build-id .dynsym .dynstr
+.gnu.hash .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text
+.fini .ARM.extab .ARM.exidx .rodata .eh_frame .eh_frame_hdr
+   03     .fini_array .init_array .dynamic .got .data .bss
+   04     .dynamic
+   05     .note.ABI-tag .note.gnu.build-id
+   06     .eh_frame_hdr
+   07
+   08     .ARM.extab .ARM.exidx
+   09     .fini_array .init_array .dynamic .got
+
+And the diff between these 2:
+
+1_2.22-r0-old/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/linkhuge_rw.readelf
+1_2.23-r0-new/sysroot-destdir/usr/lib/libhugetlbfs/tests/obj32/linkhuge_rw.readelf
+ Elf file type is DYN (Shared object file)
+-Entry point 0x201105
++Entry point 0x31cd1
+ There are 10 program headers, starting at offset 52
+
+ Program Headers:
+   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+-  PHDR           0x000034 0x00200034 0x00200034 0x00140 0x00140 R   0x4
+-  INTERP         0x000174 0x00200174 0x00200174 0x0001d 0x0001d R   0x1
++  PHDR           0x000000 0x00000000 0x00000000 0x00000 0x00000 R   0
++readelf: Error: the PHDR segment is not covered by a LOAD segment
++  INTERP         0x030d40 0x00030d40 0x00030d40 0x0001d 0x0001d R   0x1
+       [Requesting program interpreter: /usr/lib/ld-linux-armhf.so.3]
+-  LOAD           0x000000 0x00200000 0x00200000 0x1222c 0x1222c R E 0x200000
+-  LOAD           0x1ffdf0 0x005ffdf0 0x005ffdf0 0x102e0 0x202ec RW  0x200000
+-  DYNAMIC        0x1ffdf8 0x005ffdf8 0x005ffdf8 0x00128 0x00128 RW  0x4
+-  NOTE           0x000194 0x00200194 0x00200194 0x00044 0x00044 R   0x4
+-  GNU_EH_FRAME   0x012224 0x00212224 0x00212224 0x00008 0x00008 R   0x4
++  LOAD           0x030d40 0x00030d40 0x00030d40 0x120b8 0x120b8 R E 0x200000
++  LOAD           0x1ffdf0 0x003ffdf0 0x003ffdf0 0x102e0 0x202ec RW  0x200000
++  DYNAMIC        0x1ffdf8 0x003ffdf8 0x003ffdf8 0x00128 0x00128 RW  0x4
++  NOTE           0x030d60 0x00030d60 0x00030d60 0x00044 0x00044 R   0x4
++  GNU_EH_FRAME   0x042df0 0x00042df0 0x00042df0 0x00008 0x00008 R   0x4
+   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
+-  EXIDX          0x001c5c 0x00201c5c 0x00201c5c 0x00008 0x00008 R   0x4
+-  GNU_RELRO      0x1ffdf0 0x005ffdf0 0x005ffdf0 0x00210 0x00210 RW  0x4
++  EXIDX          0x032828 0x00032828 0x00032828 0x00008 0x00008 R   0x4
++  GNU_RELRO      0x1ffdf0 0x003ffdf0 0x003ffdf0 0x00210 0x00210 RW  0x4
+
+  Section to Segment mapping:
+
+Revert fixes this build issue, but I still don't see why it fails this way.
+
+Upstream-Status: Pending
+
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
+
+# Please enter the commit message for your changes. Lines starting
+# with '#' will be ignored, and an empty message aborts the commit.
+#
+# Date:      Wed Sep 16 13:43:09 2020 +0200
+#
+# On branch jansa/master
+# Changes to be committed:
+#	new file:   meta-oe/recipes-benchmark/libhugetlbfs/files/0001-Revert-ld.hugetlbfs-fix-Ttext-segment-argument-on-AA.patch
+#	modified:   meta-oe/recipes-benchmark/libhugetlbfs/libhugetlbfs_git.bb
+#
+# Untracked files:
+#	counts.txt
+#	diff
+#	log.svn
+#	log.svn2
+#	wip/
+#
+---
+ ld.hugetlbfs | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/ld.hugetlbfs b/ld.hugetlbfs
+index 5e4e497..6ee8238 100755
+--- a/ld.hugetlbfs
++++ b/ld.hugetlbfs
+@@ -130,9 +130,7 @@ if [ "$HTLB_ALIGN" == "slice" ]; then
+ 	# targeting the ARM platform one needs to explicitly set the text segment offset
+ 	# otherwise it will be NULL.
+ 	case "$EMU" in
+-	armelf*_linux_eabi|aarch64elf*|aarch64linux*)
+-		printf -v TEXTADDR "%x" "$SLICE_SIZE"
+-		HTLBOPTS="$HTLBOPTS -Ttext-segment=$TEXTADDR" ;;
++	armelf*_linux_eabi|aarch64elf*|aarch64linux*)	HTLBOPTS="$HTLBOPTS -Ttext-segment=$SLICE_SIZE" ;;
+ 	elf_i386)		HTLBOPTS="$HTLBOPTS -Ttext-segment=0x08000000" ;;
+ 	elf64ppc|elf64lppc)
+ 		if [ "$MMU_TYPE" == "Hash" ] ; then
+-- 
+2.17.1
+
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/libhugetlbfs_git.bb b/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/libhugetlbfs_git.bb
index b349096..2f07c93 100644
--- a/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/libhugetlbfs_git.bb
+++ b/meta-openembedded/meta-oe/recipes-benchmark/libhugetlbfs/libhugetlbfs_git.bb
@@ -25,6 +25,7 @@
     file://0005-Include-dirent.h-for-ino_t.patch \
     file://0006-include-limits.h-for-PATH_MAX.patch \
     file://0001-huge_page_setup_helper-use-python3-interpreter.patch \
+    file://0001-Revert-ld.hugetlbfs-fix-Ttext-segment-argument-on-AA.patch \
 "
 
 UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)"
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/memtester/files/0001-Define-mword16-and-mword8-once.patch b/meta-openembedded/meta-oe/recipes-benchmark/memtester/files/0001-Define-mword16-and-mword8-once.patch
deleted file mode 100644
index ffd9b9f..0000000
--- a/meta-openembedded/meta-oe/recipes-benchmark/memtester/files/0001-Define-mword16-and-mword8-once.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 01f1c05702eb534271777648c976ab6402a5145b Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 12 Aug 2020 23:18:30 -0700
-Subject: [PATCH] Define mword16 and mword8 once
-
-Defining them in .h meant they are defined in all .c files including
-this .h file
-
-Fixes build with gcc 10+
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- tests.c | 9 +++++++++
- types.h | 9 ---------
- 2 files changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/tests.c b/tests.c
-index be1b350..4305bed 100644
---- a/tests.c
-+++ b/tests.c
-@@ -27,6 +27,15 @@ char progress[] = "-\\|/";
- #define PROGRESSOFTEN 2500
- #define ONE 0x00000001L
- 
-+union {
-+    unsigned char bytes[UL_LEN/8];
-+    ul val;
-+} mword8;
-+
-+union {
-+    unsigned short u16s[UL_LEN/16];
-+    ul val;
-+} mword16;
- /* Function definitions. */
- 
- int compare_regions(ulv *bufa, ulv *bufb, size_t count) {
-diff --git a/types.h b/types.h
-index ad7ce73..e14ea32 100644
---- a/types.h
-+++ b/types.h
-@@ -25,12 +25,3 @@ struct test {
-     int (*fp)();
- };
- 
--union {
--    unsigned char bytes[UL_LEN/8];
--    ul val;
--} mword8;
--
--union {
--    unsigned short u16s[UL_LEN/16];
--    ul val;
--} mword16;
--- 
-2.28.0
-
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.3.0.bb b/meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.4.0.bb
similarity index 76%
rename from meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.3.0.bb
rename to meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.4.0.bb
index 3d29055..646ff90 100644
--- a/meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.3.0.bb
+++ b/meta-openembedded/meta-oe/recipes-benchmark/memtester/memtester_4.4.0.bb
@@ -7,10 +7,9 @@
 
 SRC_URI = "http://pyropus.ca/software/memtester/old-versions/${BP}.tar.gz \
            file://Makefile.patch \
-           file://0001-Define-mword16-and-mword8-once.patch \
            "
-SRC_URI[md5sum] = "598f41b7308e1f736164bca3ab84ddbe"
-SRC_URI[sha256sum] = "f9dfe2fd737c38fad6535bbab327da9a21f7ce4ea6f18c7b3339adef6bf5fd88"
+SRC_URI[md5sum] = "e1883b69cd7c0bb74ef6a475c93a4fbf"
+SRC_URI[sha256sum] = "6ffe23e6e6449b42c577c7953778fb6f698050196797a94fc619d9badc59f8e8"
 
 do_compile () {
     echo '${CC} ${CFLAGS} -DPOSIX -c' > conf-cc
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/ace/ace_6.5.10.bb b/meta-openembedded/meta-oe/recipes-connectivity/ace/ace_6.5.10.bb
index df194f9..80ae363 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/ace/ace_6.5.10.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/ace/ace_6.5.10.bb
@@ -23,7 +23,7 @@
 inherit pkgconfig
 
 CXXFLAGS_append = " -fpermissive -Wnodeprecated-declarations"
-
+CXX_append = " -ffile-prefix-map=${WORKDIR}= -fdebug-prefix-map=${WORKDIR}= "
 EXTRA_OEMAKE += "INSTALL_LIB=${baselib}"
 
 do_install() {
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
index 0b66970..9f68eb4 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
@@ -4,8 +4,8 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=db174eaf7b55a34a7c89551197f66e94"
 DEPENDS = "zeromq"
 
-SRCREV = "8d5c9a88988dcbebb72939ca0939d432230ffde1"
-PV = "4.6.0"
+SRCREV = "fef905d5982aaeb4f4bac5cccbdf8bea72728a10"
+PV = "4.7.0"
 
 SRC_URI = "git://github.com/zeromq/cppzmq.git"
 
diff --git a/meta-openembedded/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb b/meta-openembedded/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
index 46cc935..5a4375d 100644
--- a/meta-openembedded/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
+++ b/meta-openembedded/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
@@ -284,6 +284,7 @@
 RDEPENDS_packagegroup-meta-oe-devtools_append_x86-64 = " cpuid msr-tools pcimem pmtools"
 RDEPENDS_packagegroup-meta-oe-devtools_append_arm = " pcimem"
 RDEPENDS_packagegroup-meta-oe-devtools_append_aarch64 = " pcimem"
+RDEPENDS_packagegroup-meta-oe-devtools_append_libc-musl = " musl-nscd"
 
 RDEPENDS_packagegroup-meta-oe-devtools_remove_arm = "concurrencykit"
 RDEPENDS_packagegroup-meta-oe-devtools_remove_armv5 = "uftrace nodejs"
@@ -886,6 +887,7 @@
 
 RDEPENDS_packagegroup-meta-oe-test ="\
     bats \
+    cmocka \
     cppunit \
     cukinia \
     cunit \
@@ -916,6 +918,7 @@
     uthash-ptest \
     libee-ptest \
     poco-ptest \
+    cmocka-ptest \
 "
 RDEPENDS_packagegroup-meta-oe-ptest-packages_append_x86 = " mcelog-ptest"
 RDEPENDS_packagegroup-meta-oe-ptest-packages_append_x86-64 = " mcelog-ptest"
diff --git a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Add-check-for-atomic-support.patch b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Add-check-for-atomic-support.patch
index 9bfb1f3..eb9928a 100644
--- a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Add-check-for-atomic-support.patch
+++ b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Add-check-for-atomic-support.patch
@@ -1,4 +1,4 @@
-From ba0a0e54d9544babbd3963891f4e3200dd5583f5 Mon Sep 17 00:00:00 2001
+From cf168ae0b7bceab8432d096719b331f18428fe39 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 18 Mar 2020 15:10:37 -0700
 Subject: [PATCH] cmake: Add check for atomic support
@@ -20,27 +20,31 @@
 Upstream-Status: Submitted [https://github.com/facebook/rocksdb/pull/6555]
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
- CMakeLists.txt                  |  6 +++
+ CMakeLists.txt                  |  5 +++
  cmake/modules/CheckAtomic.cmake | 69 +++++++++++++++++++++++++++++++++
- 2 files changed, 75 insertions(+)
+ 2 files changed, 74 insertions(+)
  create mode 100644 cmake/modules/CheckAtomic.cmake
 
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index f9c8f3346..4d604004b 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
-@@ -780,7 +780,13 @@ if(WIN32)
+@@ -852,7 +852,12 @@ endif()
+ if(WIN32)
    set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
-   set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
  else()
 +  # check if linking against libatomic is necessary
 +  include(CheckAtomic)
-+
    set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
 +  if(HAVE_CXX_ATOMIC_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB)
 +    set(SYSTEM_LIBS ${SYSTEM_LIBS} atomic)
 +  endif()
-   set(LIBS ${ROCKSDB_SHARED_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
+ endif()
  
-   add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
+ add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
+diff --git a/cmake/modules/CheckAtomic.cmake b/cmake/modules/CheckAtomic.cmake
+new file mode 100644
+index 000000000..8b7dc8a37
 --- /dev/null
 +++ b/cmake/modules/CheckAtomic.cmake
 @@ -0,0 +1,69 @@
@@ -113,3 +117,6 @@
 +  endif()
 +endif()
 +
+-- 
+2.28.0
+
diff --git a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Use-exported-target-for-bz2.patch b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Use-exported-target-for-bz2.patch
new file mode 100644
index 0000000..57433b0
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-cmake-Use-exported-target-for-bz2.patch
@@ -0,0 +1,43 @@
+From 46a4e585175cac8d76bd0b64f0fc27c9e22f04a1 Mon Sep 17 00:00:00 2001
+From: Pascal Bach <pascal.bach@nextrem.ch>
+Date: Mon, 12 Oct 2020 21:22:46 +0200
+Subject: [PATCH] cmake: Use exported target for bz2
+
+Without this change, CMake puts the entire path into the generated file.
+This is not portable and makes it fail in environment like Yocto.
+
+Upstream-Status: Submitted [https://github.com/facebook/rocksdb/pull/7541]
+---
+ CMakeLists.txt | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 676192913..801586c30 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -32,7 +32,7 @@
+ # 3. cmake ..
+ # 4. make -j
+ 
+-cmake_minimum_required(VERSION 3.5.1)
++cmake_minimum_required(VERSION 3.7.2)
+ 
+ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
+ include(ReadVersion)
+@@ -148,12 +148,7 @@ else()
+   if(WITH_BZ2)
+     find_package(BZip2 REQUIRED)
+     add_definitions(-DBZIP2)
+-    if(BZIP2_INCLUDE_DIRS)
+-      include_directories(${BZIP2_INCLUDE_DIRS})
+-    else()
+-      include_directories(${BZIP2_INCLUDE_DIR})
+-    endif()
+-    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
++    list(APPEND THIRDPARTY_LIBS BZip2::BZip2)
+   endif()
+ 
+   if(WITH_LZ4)
+-- 
+2.28.0
+
diff --git a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-db-write_thread.cc-Initialize-state.patch b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-db-write_thread.cc-Initialize-state.patch
deleted file mode 100644
index 97ddbce..0000000
--- a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/files/0001-db-write_thread.cc-Initialize-state.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 49dcd22dcf1aae5995c42eac0fda68516fc1cd43 Mon Sep 17 00:00:00 2001
-From: Robert Yang <liezhi.yang@windriver.com>
-Date: Wed, 19 Jun 2019 17:57:24 +0800
-Subject: [PATCH] db/write_thread.cc: Initialize state
-
-Fixed an error when compiled without -O2:
-db/write_thread.cc:183:14: error: 'state' may be used uninitialized in this function [-Werror=maybe-uninitialized]
-
-Upstream-Status: Pending
-
-Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
----
- db/write_thread.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/db/write_thread.cc b/db/write_thread.cc
-index 835992c..6f99a11 100644
---- a/db/write_thread.cc
-+++ b/db/write_thread.cc
-@@ -59,7 +59,7 @@ uint8_t WriteThread::BlockingAwaitState(Writer* w, uint8_t goal_mask) {
- 
- uint8_t WriteThread::AwaitState(Writer* w, uint8_t goal_mask,
-                                 AdaptationContext* ctx) {
--  uint8_t state;
-+  uint8_t state = 0;
- 
-   // 1. Busy loop using "pause" for 1 micro sec
-   // 2. Else SOMETIMES busy loop using "yield" for 100 micro sec (default)
--- 
-2.7.4
-
diff --git a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/rocksdb_git.bb b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/rocksdb_git.bb
index b9038df..7ebc5ab 100644
--- a/meta-openembedded/meta-oe/recipes-dbs/rocksdb/rocksdb_git.bb
+++ b/meta-openembedded/meta-oe/recipes-dbs/rocksdb/rocksdb_git.bb
@@ -6,13 +6,13 @@
                     file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
                     file://LICENSE.leveldb;md5=fb04ff57a14f308f2eed4a9b87d45837"
 
-SRCREV = "551a110918493a19d11243f53408b97485de1411"
-SRCBRANCH = "6.6.fb"
-PV = "6.6.4"
+SRCREV = "48bfca38f6f175435052a59791922a1a453d9609"
+SRCBRANCH = "6.11.fb"
+PV = "6.11.4"
 
 SRC_URI = "git://github.com/facebook/${BPN}.git;branch=${SRCBRANCH} \
-           file://0001-db-write_thread.cc-Initialize-state.patch \
            file://0001-cmake-Add-check-for-atomic-support.patch \
+           file://0001-cmake-Use-exported-target-for-bz2.patch \
           "
 
 S = "${WORKDIR}/git"
@@ -31,6 +31,7 @@
 EXTRA_OECMAKE = "\
     -DPORTABLE=ON \
     -DWITH_TESTS=OFF \
+    -DWITH_BENCHMARK_TOOLS=OFF \
     -DWITH_TOOLS=OFF \
     -DFAIL_ON_WARNINGS=OFF \
 "
diff --git a/meta-openembedded/meta-oe/recipes-devtools/dnf-plugin-tui/dnf-plugin-tui_git.bb b/meta-openembedded/meta-oe/recipes-devtools/dnf-plugin-tui/dnf-plugin-tui_git.bb
index 406494e..2a42093 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/dnf-plugin-tui/dnf-plugin-tui_git.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/dnf-plugin-tui/dnf-plugin-tui_git.bb
@@ -4,8 +4,8 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
 
 SRC_URI = "git://github.com/ubinux/dnf-plugin-tui.git;branch=master "
-SRCREV = "c5416adeb210154dc4ccc4c3e1c5297d83ebd41e"
-PV = "1.1"
+SRCREV = "95f3c6ab36840fb1e0f4935f34dbf8f708b7780c"
+PV = "1.2"
 
 SRC_URI_append_class-target = "file://oe-remote.repo.sample"
 
diff --git a/meta-openembedded/meta-oe/recipes-devtools/musl/musl-nscd_git.bb b/meta-openembedded/meta-oe/recipes-devtools/musl/musl-nscd_git.bb
new file mode 100644
index 0000000..374f944
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-devtools/musl/musl-nscd_git.bb
@@ -0,0 +1,37 @@
+# Copyright (C) 2020 Armin Kuster <akuster808@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Musl-nscd is an implementation of the NSCD protocol, suitable for use with musl and with standard NSS modules"
+HOMEPAGE = "https://github.com/pikhq/musl-nscd"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=9bf479a145bcaff8489e743da58afeee"
+SECTION = "utils"
+
+PV = "1.0.2"
+
+CFLAGS += "-fcommon"
+
+SRCREV = "8f278675e1b6a3a02c8ee1b8ca000f80570dc5d6"
+SRC_URI = "git://github.com/pikhq/musl-nscd"
+
+UPSTREAM_CHECK_COMMITS = "1"
+
+inherit autotools-brokensep
+
+S = "${WORKDIR}/git"
+
+do_configure () {
+    # no debug set -s flag
+    sed -i -e 's/LDFLAGS_AUTO=-s/LDFLAGS_AUTO=/' ${S}/configure
+    ${S}/configure ${CONFIGUREOPTS} ${EXTRA_OECONF}
+}
+
+do_compile () {
+    oe_runmake
+}
+
+do_install () {
+    make DESTDIR=${D} install
+}
+
+COMPATIBLE_HOST = ".*-musl.*"
diff --git a/meta-openembedded/meta-oe/recipes-extended/byacc/byacc/0001-byacc-do-not-reorder-CC-and-CFLAGS.patch b/meta-openembedded/meta-oe/recipes-extended/byacc/byacc/0001-byacc-do-not-reorder-CC-and-CFLAGS.patch
index c7830ed..5dcc6af 100644
--- a/meta-openembedded/meta-oe/recipes-extended/byacc/byacc/0001-byacc-do-not-reorder-CC-and-CFLAGS.patch
+++ b/meta-openembedded/meta-oe/recipes-extended/byacc/byacc/0001-byacc-do-not-reorder-CC-and-CFLAGS.patch
@@ -15,16 +15,19 @@
 
 Update for 20191103.
 Signed-off-by: Zheng Ruoqin <zhengrq.fnst@cn.fujitsu.com>
+
+Update for 20200910.
+Signed-off-by: Zang Ruochen <zangrc.fnst@cn.fujitsu.com>
 ---
  aclocal.m4 |   1 -
- configure  | 259 -------------------------------------------------------------
+ configure  | 259 -----------------------------------------------------
  2 files changed, 260 deletions(-)
 
 diff --git a/aclocal.m4 b/aclocal.m4
-index b90cfe6..413ea9c 100644
+index 1c6a3ee..2f7e9b5 100644
 --- a/aclocal.m4
 +++ b/aclocal.m4
-@@ -1232,7 +1232,6 @@ CF_GCC_VERSION
+@@ -1317,7 +1317,6 @@ CF_GCC_VERSION
  CF_ACVERSION_CHECK(2.52,
  	[AC_PROG_CC_STDC],
  	[CF_ANSI_CC_REQD])
@@ -33,20 +36,20 @@
  dnl ---------------------------------------------------------------------------
  dnl CF_PROG_GROFF version: 3 updated: 2018/01/07 13:16:19
 diff --git a/configure b/configure
-index ec77bba..234f271 100755
+index 378f27d..8f40229 100755
 --- a/configure
 +++ b/configure
-@@ -2059,265 +2059,6 @@ esac
+@@ -2066,265 +2066,6 @@ esac
  # This should have been defined by AC_PROG_CC
  : ${CC:=cc}
  
--echo "$as_me:2062: checking \$CFLAGS variable" >&5
+-echo "$as_me:2069: checking \$CFLAGS variable" >&5
 -echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
 -case "x$CFLAGS" in
 -(*-[IUD]*)
--	echo "$as_me:2066: result: broken" >&5
+-	echo "$as_me:2073: result: broken" >&5
 -echo "${ECHO_T}broken" >&6
--	{ echo "$as_me:2068: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+-	{ echo "$as_me:2075: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
 -echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
 -	cf_flags="$CFLAGS"
 -	CFLAGS=
@@ -154,18 +157,18 @@
 -	done
 -	;;
 -(*)
--	echo "$as_me:2176: result: ok" >&5
+-	echo "$as_me:2183: result: ok" >&5
 -echo "${ECHO_T}ok" >&6
 -	;;
 -esac
 -
--echo "$as_me:2181: checking \$CC variable" >&5
+-echo "$as_me:2188: checking \$CC variable" >&5
 -echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
 -case "$CC" in
 -(*[\ \	]-*)
--	echo "$as_me:2185: result: broken" >&5
+-	echo "$as_me:2192: result: broken" >&5
 -echo "${ECHO_T}broken" >&6
--	{ echo "$as_me:2187: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+-	{ echo "$as_me:2194: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
 -echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
 -	# humor him...
 -	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
@@ -282,26 +285,26 @@
 -	done
 -	test -n "$verbose" && echo "	resulting CC: '$CC'" 1>&6
 -
--echo "${as_me:-configure}:2304: testing resulting CC: '$CC' ..." 1>&5
+-echo "${as_me:-configure}:2311: testing resulting CC: '$CC' ..." 1>&5
 -
 -	test -n "$verbose" && echo "	resulting CFLAGS: '$CFLAGS'" 1>&6
 -
--echo "${as_me:-configure}:2308: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+-echo "${as_me:-configure}:2315: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
 -
 -	test -n "$verbose" && echo "	resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
 -
--echo "${as_me:-configure}:2312: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+-echo "${as_me:-configure}:2319: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
 -
 -	;;
 -(*)
--	echo "$as_me:2316: result: ok" >&5
+-	echo "$as_me:2323: result: ok" >&5
 -echo "${ECHO_T}ok" >&6
 -	;;
 -esac
 -
- echo "$as_me:2321: checking whether ${MAKE-make} sets \${MAKE}" >&5
+ echo "$as_me:2328: checking whether ${MAKE-make} sets \${MAKE}" >&5
  echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
  set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
 -- 
-2.7.4
+2.25.1
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200330.bb b/meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200910.bb
similarity index 74%
rename from meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200330.bb
rename to meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200910.bb
index 975311c..b7640ff 100644
--- a/meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200330.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/byacc/byacc_20200910.bb
@@ -7,5 +7,5 @@
 LIC_FILES_CHKSUM = "file://package/debian/copyright;md5=262857ec5923f073fa06a1f1812225ea"
 require byacc.inc
 
-SRC_URI[md5sum] = "decf6e6b82ea2efae6bbad32d7777da8"
-SRC_URI[sha256sum] = "e099e2dd8a684d739ac6b9a0e43d468314a5bc34fd21466502d120b18df51fb0"
+SRC_URI[md5sum] = "5726a5a655c6fd4e8f950552cceeae29"
+SRC_URI[sha256sum] = "0a5906073aeaf23ddc20aaac0ea61cb5ccc18572870b113375dec4ffe85ecf30"
diff --git a/meta-openembedded/meta-oe/recipes-extended/collectd/collectd_5.12.0.bb b/meta-openembedded/meta-oe/recipes-extended/collectd/collectd_5.12.0.bb
index 40a8442..b9e735f 100644
--- a/meta-openembedded/meta-oe/recipes-extended/collectd/collectd_5.12.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/collectd/collectd_5.12.0.bb
@@ -49,6 +49,8 @@
 PACKAGECONFIG[libmnl] = "--with-libmnl,--without-libmnl,libmnl"
 PACKAGECONFIG[libatasmart] = "--with-libatasmart,--without-libatasmart,libatasmart"
 PACKAGECONFIG[ldap] = "--enable-openldap --with-libldap,--disable-openldap --without-libldap, openldap"
+PACKAGECONFIG[rrdtool] = "--enable-rrdtool,--disable-rrdtool,rrdtool"
+PACKAGECONFIG[rrdcached] = "--enable-rrdcached,--disable-rrdcached,rrdcached"
 
 EXTRA_OECONF = " \
                 ${FPLAYOUT} \
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-CMakeLists.txt-use-curl-local-source-tarball.patch b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-CMakeLists.txt-use-curl-local-source-tarball.patch
new file mode 100644
index 0000000..183a006
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-CMakeLists.txt-use-curl-local-source-tarball.patch
@@ -0,0 +1,34 @@
+From 8d99edeefb23c9d7574a0b5a0e2e3f41b0433490 Mon Sep 17 00:00:00 2001
+From: Yi Zhao <yi.zhao@windriver.com>
+Date: Thu, 10 Sep 2020 16:14:10 +0800
+Subject: [PATCH] CMakeLists.txt: use curl local source tarball
+
+Do not download curl source during compile.
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
+---
+ CMakeLists.txt | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 7cd550fb..215a4ef4 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -314,11 +314,7 @@ endif()
+ 
+   ExternalProject_Add(
+     curl-external
+-    GIT_REPOSITORY "https://github.com/curl/curl.git"
+-    GIT_TAG "f3294d9d86e6a7915a967efff2842089b8b0d071"  # Version 7.64.0
+-    SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-src"
+-    LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+-    TLS_VERIFY OFF
++    SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/curl-7.64.0"
+     CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+                "-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-install"
+                "-DCMAKE_INSTALL_LIBDIR=lib${LIBSUFFIX}"
+-- 
+2.17.1
+
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0002-cmake-LibreSSL.cmake-use-libressl-local-source-tarba.patch b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0002-cmake-LibreSSL.cmake-use-libressl-local-source-tarba.patch
new file mode 100644
index 0000000..da5ee97
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0002-cmake-LibreSSL.cmake-use-libressl-local-source-tarba.patch
@@ -0,0 +1,32 @@
+From 5a5317044b0039e9e19aabcecb7b666a3f13e136 Mon Sep 17 00:00:00 2001
+From: Yi Zhao <yi.zhao@windriver.com>
+Date: Thu, 10 Sep 2020 15:08:19 +0800
+Subject: [PATCH] cmake/LibreSSL.cmake: use libressl local source tarball
+
+Do not download libressl source during compile.
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
+---
+ cmake/LibreSSL.cmake | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/cmake/LibreSSL.cmake b/cmake/LibreSSL.cmake
+index 57319e40..bab30129 100644
+--- a/cmake/LibreSSL.cmake
++++ b/cmake/LibreSSL.cmake
+@@ -43,9 +43,7 @@ function(use_libre_ssl SOURCE_DIR BINARY_DIR)
+ 
+ 	ExternalProject_Add(
+ 	libressl-portable
+-	URL https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://gentoo.osuosl.org/distfiles/libressl-2.8.3.tar.gz
+-	URL_HASH "SHA256=9b640b13047182761a99ce3e4f000be9687566e0828b4a72709e9e6a3ef98477"
+-	SOURCE_DIR "${BINARY_DIR}/thirdparty/libressl-src"
++	SOURCE_DIR "${SOURCE_DIR}/thirdparty/libressl-2.8.3"
+ 	PATCH_COMMAND ${PATCH}
+ 	CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+ 				"-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libressl-install"
+-- 
+2.17.1
+
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0003-cmake-BundledOSSPUUID.cmake-use-ossp-uuid-local-sour.patch b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0003-cmake-BundledOSSPUUID.cmake-use-ossp-uuid-local-sour.patch
new file mode 100644
index 0000000..a39e15b
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0003-cmake-BundledOSSPUUID.cmake-use-ossp-uuid-local-sour.patch
@@ -0,0 +1,34 @@
+From 74ade26f7ccd0dbc4ad97cb3082204118a67c92b Mon Sep 17 00:00:00 2001
+From: Yi Zhao <yi.zhao@windriver.com>
+Date: Thu, 10 Sep 2020 15:12:41 +0800
+Subject: [PATCH] cmake/BundledOSSPUUID.cmake: use ossp-uuid local source
+ tarball
+
+Do not download ossp-uuid source during compile.
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
+---
+ cmake/BundledOSSPUUID.cmake | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/cmake/BundledOSSPUUID.cmake b/cmake/BundledOSSPUUID.cmake
+index 1103156d..0cf4bac0 100644
+--- a/cmake/BundledOSSPUUID.cmake
++++ b/cmake/BundledOSSPUUID.cmake
+@@ -47,10 +47,8 @@ function(use_bundled_osspuuid SOURCE_DIR BINARY_DIR)
+ 
+     ExternalProject_Add(
+             ossp-uuid-external
+-            URL "https://deb.debian.org/debian/pool/main/o/ossp-uuid/ossp-uuid_1.6.2.orig.tar.gz"
+-            URL_HASH "SHA256=11a615225baa5f8bb686824423f50e4427acd3f70d394765bdff32801f0fd5b0"
+             BUILD_IN_SOURCE true
+-            SOURCE_DIR "${BINARY_DIR}/thirdparty/ossp-uuid-src"
++            SOURCE_DIR "${SOURCE_DIR}/thirdparty/uuid-1.6.2"
+             BUILD_COMMAND make
+             CMAKE_COMMAND ""
+             UPDATE_COMMAND ""
+-- 
+2.17.1
+
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/minifi.service b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/minifi.service
index 5802a7b..059cdbc 100644
--- a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/minifi.service
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/minifi.service
@@ -5,7 +5,7 @@
 
 [Service]
 Type=simple
-WorkingDirectory=@LOCALSTATEDIR@/run/minifi
+WorkingDirectory=@LOCALSTATEDIR@/lib/minifi
 Environment=MINIFI_HOME=@SYSCONFDIR@/minifi
 ExecStart=@BINDIR@/minifi
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/systemd-volatile.conf b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/systemd-volatile.conf
index c828b49..6da442d 100644
--- a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/systemd-volatile.conf
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/systemd-volatile.conf
@@ -1,2 +1 @@
-d @MINIFI_RUN@ 0755 root root -
 d @MINIFI_LOG@ 0755 root root -
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/sysvinit-volatile.conf b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/sysvinit-volatile.conf
index 2ad14e6..db149d0 100644
--- a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/sysvinit-volatile.conf
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/sysvinit-volatile.conf
@@ -1,2 +1 @@
-d root root 0755 @MINIFI_RUN@ none
 d root root 0755 @MINIFI_LOG@ none
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
index 37036eb..5127e11 100644
--- a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
@@ -12,6 +12,9 @@
 
 SRCREV = "aa42957a2e227df41510047cece3cd606dc1cb6a"
 SRC_URI = "git://github.com/apache/nifi-minifi-cpp.git \
+            https://curl.haxx.se/download/curl-7.64.0.tar.bz2;name=curl;subdir=git/thirdparty \
+            https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz;name=libressl;subdir=git/thirdparty \
+            ${DEBIAN_MIRROR}/main/o/ossp-uuid/ossp-uuid_1.6.2.orig.tar.gz;name=ossp-uuid;subdir=git/thirdparty \
             file://fix-minifi-compile.patch \
             file://fix-libressl-compile.patch \
             file://fix-libressl-avoid-BSWAP-assembly-for-ARM-v6.patch \
@@ -21,10 +24,21 @@
             file://fix-rocksdb-cross-compile.patch \
             file://remove_const_due_to_std_lock_guard.patch \
             file://0001-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch \
+            file://0001-CMakeLists.txt-use-curl-local-source-tarball.patch \
+            file://0002-cmake-LibreSSL.cmake-use-libressl-local-source-tarba.patch \
+            file://0003-cmake-BundledOSSPUUID.cmake-use-ossp-uuid-local-sour.patch \
             file://minifi.service \
             file://systemd-volatile.conf \
             file://sysvinit-volatile.conf \
             "
+
+SRC_URI[curl.md5sum] = "d0bcc586873cfef08b4b9594e5395a33"
+SRC_URI[curl.sha256sum] = "d573ba1c2d1cf9d8533fadcce480d778417964e8d04ccddcc76e591d544cf2eb"
+SRC_URI[libressl.md5sum] = "0f1127bd21b4aa8495a910379c2ad936"
+SRC_URI[libressl.sha256sum] = "9b640b13047182761a99ce3e4f000be9687566e0828b4a72709e9e6a3ef98477"
+SRC_URI[ossp-uuid.md5sum] = "5db0d43a9022a6ebbbc25337ae28942f"
+SRC_URI[ossp-uuid.sha256sum] = "11a615225baa5f8bb686824423f50e4427acd3f70d394765bdff32801f0fd5b0"
+
 S = "${WORKDIR}/git"
 
 inherit pkgconfig cmake systemd
@@ -52,19 +66,20 @@
 TARGET_CFLAGS_append_riscv64 += "-fpic"
 TARGET_CXXFLAGS_append_riscv64 += "-fpic"
 
+do_install[cleandirs] += "${WORKDIR}/minifi-install"
 
 do_install() {
-    DESTDIR='${B}/minifi-install' cmake_runcmake_build --target ${OECMAKE_TARGET_INSTALL}
-
-    MINIFI_BIN=${base_prefix}${bindir}
-    MINIFI_HOME=${base_prefix}${sysconfdir}/minifi
-    MINIFI_RUN=${base_prefix}${localstatedir}/run/minifi
-    MINIFI_LOG=${base_prefix}${localstatedir}/log/minifi
+    DESTDIR='${WORKDIR}/minifi-install' cmake_runcmake_build --target ${OECMAKE_TARGET_INSTALL}
+    MINIFI_BIN=${bindir}
+    MINIFI_HOME=${sysconfdir}/minifi
+    MINIFI_RUN=${localstatedir}/lib/minifi
+    MINIFI_LOG=${localstatedir}/log/minifi
 
     install -d ${D}${MINIFI_BIN}
     install -d ${D}${MINIFI_HOME}/conf
-    cp -a ${B}/minifi-install/usr/bin/*   ${D}${MINIFI_BIN}/
-    cp -a ${B}/minifi-install/usr/conf/*  ${D}${MINIFI_HOME}/conf/
+    install -m 755 -d ${D}${localstatedir}/lib/minifi
+    cp -a ${WORKDIR}/minifi-install/usr/bin/*   ${D}${MINIFI_BIN}/
+    cp -a ${WORKDIR}/minifi-install/usr/conf/*  ${D}${MINIFI_HOME}/conf/
 
     sed -i 's|#appender.rolling.directory=.*|appender.rolling.directory='${MINIFI_LOG}'|g' \
         ${D}${MINIFI_HOME}/conf/minifi-log.properties
@@ -79,11 +94,11 @@
 
     sed -i 's|export MINIFI_HOME=.*|export MINIFI_HOME='${MINIFI_HOME}'|g' ${D}${MINIFI_BIN}/minifi.sh
     sed -i 's|bin_dir=${MINIFI_HOME}/bin|bin_dir='${MINIFI_BIN}'|g' ${D}${MINIFI_BIN}/minifi.sh
-    sed -i 's|pid_file=${bin_dir}|pid_file='${MINIFI_RUN}'|g' ${D}${MINIFI_BIN}/minifi.sh
+    sed -i 's|pid_file=${bin_dir}/.|pid_file='${localstatedir}/run/'|g' ${D}${MINIFI_BIN}/minifi.sh
 
     if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
         install -d ${D}${sysconfdir}/tmpfiles.d/
-        install -m 0644 ${WORKDIR}/systemd-volatile.conf ${D}${sysconfdir}/tmpfiles.d/
+        install -m 0644 ${WORKDIR}/systemd-volatile.conf ${D}${sysconfdir}/tmpfiles.d/minifi.conf
         install -m 0755 -d ${D}${systemd_unitdir}/system
         install -m 0644 ${WORKDIR}/minifi.service ${D}${systemd_unitdir}/system/
 
@@ -91,14 +106,12 @@
         sed -i 's|@SYSCONFDIR@|${sysconfdir}|g' ${D}${systemd_unitdir}/system/minifi.service
         sed -i 's|@BINDIR@|${bindir}|g' ${D}${systemd_unitdir}/system/minifi.service
 
-        sed -i 's|@MINIFI_RUN@|'${MINIFI_RUN}'|g' ${D}${sysconfdir}/tmpfiles.d/systemd-volatile.conf
-        sed -i 's|@MINIFI_LOG@|'${MINIFI_LOG}'|g' ${D}${sysconfdir}/tmpfiles.d/systemd-volatile.conf
+        sed -i 's|@MINIFI_LOG@|'${MINIFI_LOG}'|g' ${D}${sysconfdir}/tmpfiles.d/minifi.conf
 
     elif ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
         install -d ${D}${sysconfdir}/default/volatiles
         install -m 0644 ${WORKDIR}/sysvinit-volatile.conf ${D}${sysconfdir}/default/volatiles/99_minifi
 
-        sed -i 's|@MINIFI_RUN@|'${MINIFI_RUN}'|g' ${D}${sysconfdir}/default/volatiles/99_minifi
         sed -i 's|@MINIFI_LOG@|'${MINIFI_LOG}'|g' ${D}${sysconfdir}/default/volatiles/99_minifi
     fi
 }
@@ -112,9 +125,3 @@
         fi
     fi
 }
-
-FILES_${PN} = " \
-        ${bindir} \
-        ${sysconfdir} \
-        ${systemd_unitdir} \
-        "
diff --git a/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.7.bb b/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.8.bb
similarity index 93%
rename from meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.7.bb
rename to meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.8.bb
index 791e41e..64b137c 100644
--- a/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.7.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.0.8.bb
@@ -17,8 +17,8 @@
            file://GNU_SOURCE.patch \
            "
 
-SRC_URI[md5sum] = "ac57b7188b771bbc08e8d7d6dddb3a80"
-SRC_URI[sha256sum] = "c2aaa1a4c7e72c70adedf976fdd5e1d34d395989283dab9d7840e0a304bb2393"
+SRC_URI[md5sum] = "70113b4b8ea7ee4c7e148be62b5d1e0b"
+SRC_URI[sha256sum] = "04fa1fddc39bd1aecb6739dd5dd73858a3515b427acd1e2947a66dadce868d68"
 
 inherit autotools-brokensep update-rc.d systemd useradd
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/smartmontools/files/smartd.service b/meta-openembedded/meta-oe/recipes-extended/smartmontools/files/smartd.service
index f3db946..e90a7c4 100644
--- a/meta-openembedded/meta-oe/recipes-extended/smartmontools/files/smartd.service
+++ b/meta-openembedded/meta-oe/recipes-extended/smartmontools/files/smartd.service
@@ -6,7 +6,6 @@
 EnvironmentFile=-@SYSCONFDIR@/smartmontools
 ExecStart=@SBINDIR@/smartd -n $smart_opts
 ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID
-StandardOutput=syslog
 
 [Install]
 WantedBy=multi-user.target
diff --git a/meta-openembedded/meta-oe/recipes-graphics/gphoto2/libgphoto2_2.5.25.bb b/meta-openembedded/meta-oe/recipes-graphics/gphoto2/libgphoto2_2.5.25.bb
index 8daf737..fe7657f 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/gphoto2/libgphoto2_2.5.25.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/gphoto2/libgphoto2_2.5.25.bb
@@ -29,6 +29,12 @@
     cp ${STAGING_DATADIR_NATIVE}/gettext/po/Makefile.in.in ${S}/libgphoto2_port/po/
     cd ${S}/libgphoto2_port/
     autoreconf -Wcross --verbose --install --force ${EXTRA_AUTORECONF} $acpaths
+
+    # remove WORKDIR information from config to improve reproducibility
+    # libgphoto2_port recheck config will set the WORKDIR info again, so dont do that
+    sed -i 's/'$(echo ${WORKDIR} | sed 's_/_\\/_g')'/../g' ${B}/config.h
+    sed -i 's/'$(echo ${WORKDIR} | sed 's_/_\\/_g')'/../g' ${B}/libgphoto2_port/config.status
+    sed -i '/config\.status/ s/\-\-recheck//' ${B}/libgphoto2_port/Makefile
     cd ${S}
 }
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.20.bb b/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.22.bb
similarity index 85%
rename from meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.20.bb
rename to meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.22.bb
index 356c78c..b2b053a 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.20.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.22.bb
@@ -1,10 +1,10 @@
 SUMMARY = "Jpeg 2000 implementation"
-HOMEPAGE = "https://github.com/jasper-software/jasper"
+HOMEPAGE = "https://jasper-software.github.io/jasper/"
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a80440d1d8f17d041c71c7271d6e06eb"
 
 SRC_URI = "git://github.com/jasper-software/jasper.git;protocol=https"
-SRCREV = "d10a710f31da3d079a984d35ff6cc82a853d25d7"
+SRCREV = "95b2f0583a71c92cddefb54b522efe717b7a5adc"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/suckless/st_0.8.4.bb b/meta-openembedded/meta-oe/recipes-graphics/suckless/st_0.8.4.bb
index 9061795..1f0f2f7 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/suckless/st_0.8.4.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/suckless/st_0.8.4.bb
@@ -23,3 +23,13 @@
 FILES_${PN} += " \
     ${datadir}/terminfo \
 "
+
+inherit update-alternatives
+
+ALTERNATIVE_PRIORITY = "50"
+
+ALTERNATIVE_${PN} = "st st-256color"
+
+ALTERNATIVE_LINK_NAME[st] = "${datadir}/terminfo/s/st"
+
+ALTERNATIVE_LINK_NAME[st-256color] = "${datadir}/terminfo/s/st-256color"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-hunkyfonts_0.3.1.bb b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-hunkyfonts_0.3.1.bb
index 4df0c3a..9c89f97 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-hunkyfonts_0.3.1.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-hunkyfonts_0.3.1.bb
@@ -8,7 +8,7 @@
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/hunkyfonts/hunkyfonts-${PV}.tar.bz2"
 
-S = "${WORKDIR}/hunkyfonts-${PV}/TTF/"
+S = "${WORKDIR}/hunkyfonts-${PV}/TTF"
 
 PACKAGES = "ttf-hunky-sans ttf-hunky-serif"
 FONT_PACKAGES = "ttf-hunky-sans ttf-hunky-serif"
diff --git a/meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200721.bb b/meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200819.bb
similarity index 96%
rename from meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200721.bb
rename to meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200819.bb
index df85cd4..c746b6e 100644
--- a/meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200721.bb
+++ b/meta-openembedded/meta-oe/recipes-multimedia/live555/live555_20200819.bb
@@ -16,7 +16,7 @@
 # only latest live version stays on http://www.live555.com/liveMedia/public/, add mirror for older
 MIRRORS += "http://www.live555.com/liveMedia/public/ http://download.videolan.org/contrib/live555/ \n"
 
-SRC_URI[sha256sum] = "89b2d99589de2ce9b4007ea6625dfce28317421604cf5131f4e1bf5bf7040b63"
+SRC_URI[sha256sum] = "af3af7f2510b0b45f38892c232abca2cee2ab36a62503e7085b47ed2c3c2c537"
 
 S = "${WORKDIR}/live"
 
diff --git a/meta-openembedded/meta-oe/recipes-multimedia/mplayer/mpv_0.32.0.bb b/meta-openembedded/meta-oe/recipes-multimedia/mplayer/mpv_0.32.0.bb
index e5f1096..057f9c6 100644
--- a/meta-openembedded/meta-oe/recipes-multimedia/mplayer/mpv_0.32.0.bb
+++ b/meta-openembedded/meta-oe/recipes-multimedia/mplayer/mpv_0.32.0.bb
@@ -42,7 +42,6 @@
     ${@bb.utils.filter('DISTRO_FEATURES', 'opengl', d)} \
 "
 
-PACKAGECONFIG_remove_aarch64 = "lua"
 PACKAGECONFIG[x11] = "--enable-x11,--disable-x11,virtual/libx11"
 PACKAGECONFIG[xv] = "--enable-xv,--disable-xv,libxv"
 PACKAGECONFIG[opengl] = "--enable-gl,--disable-gl,virtual/libgl"
diff --git a/meta-openembedded/meta-oe/recipes-support/glog/glog_0.3.5.bb b/meta-openembedded/meta-oe/recipes-support/glog/glog_0.3.5.bb
index 9a83328..56bf515 100644
--- a/meta-openembedded/meta-oe/recipes-support/glog/glog_0.3.5.bb
+++ b/meta-openembedded/meta-oe/recipes-support/glog/glog_0.3.5.bb
@@ -25,3 +25,10 @@
 
 PACKAGECONFIG[unwind] = "-DWITH_UNWIND=ON,-DWITH_UNWIND=OFF,libunwind,libunwind"
 PACKAGECONFIG[shared] = "-DBUILD_SHARED_LIBS=ON,-DBUILD_SHARED_LIBS=OFF,,"
+
+do_configure_append() {
+    # remove WORKDIR info to improve reproducibility
+    if [ -f  "${B}/config.h" ] ; then
+        sed -i 's/'$(echo ${WORKDIR} | sed 's_/_\\/_g')'/../g' ${B}/config.h
+    fi
+}
diff --git a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod.inc b/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod.inc
deleted file mode 100644
index cae3145..0000000
--- a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-SUMMARY = "C library and tools for interacting with the linux GPIO character device"
-
-LICENSE = "LGPLv2.1+"
-LIC_FILES_CHKSUM = "file://COPYING;md5=2caced0b25dfefd4c601d92bd15116de"
-
-SRC_URI = "https://www.kernel.org/pub/software/libs/libgpiod/${BP}.tar.xz"
-
-inherit autotools pkgconfig
-
-PACKAGECONFIG[tests] = "--enable-tests,--disable-tests,kmod udev"
-
-EXTRA_OECONF = "--enable-tools"
-
-PACKAGES =+ " ${PN}-tools"
-
-FILES_${PN}-tools = "${bindir}/*"
-
-PACKAGES =+ "libgpiodcxx"
-FILES_libgpiodcxx = "${libdir}/libgpiodcxx.so.*"
diff --git a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_0.3.3.bb b/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_0.3.3.bb
deleted file mode 100644
index c4d2bdd..0000000
--- a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_0.3.3.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require libgpiod.inc
-
-PACKAGECONFIG ?= ""
-
-PACKAGECONFIG[tests] = "--enable-tests,--disable-tests,kmod udev"
-
-SRC_URI[md5sum] = "2aa1e1a80c3c919ae142ab9a55fb59ca"
-SRC_URI[sha256sum] = "b773e557af1a497f786825462a776b7bf90168e67ee0a5bc5d2473a5674dc38c"
diff --git a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_1.4.4.bb b/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_1.4.4.bb
index a9a4628..6433675 100644
--- a/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_1.4.4.bb
+++ b/meta-openembedded/meta-oe/recipes-support/libgpiod/libgpiod_1.4.4.bb
@@ -1,19 +1,31 @@
-require libgpiod.inc
+SUMMARY = "C library and tools for interacting with the linux GPIO character device"
+AUTHOR = "Bartosz Golaszewski <bgolaszewski@baylibre.com>"
 
-DEPENDS += "autoconf-archive-native"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=2caced0b25dfefd4c601d92bd15116de"
 
+SRC_URI = "https://www.kernel.org/pub/software/libs/${BPN}/${BP}.tar.xz"
 SRC_URI[md5sum] = "064c2627397e6641c52de09a26951112"
 SRC_URI[sha256sum] = "f1cda2789e6a13a92aefc012a76e5a7cc57a1b402d66f71df8719ee314b67699"
 
-# enable cxx bindings
-PACKAGECONFIG ?= "cxx"
+inherit autotools pkgconfig python3native
 
-PACKAGECONFIG[cxx] = "--enable-bindings-cxx,--disable-bindings-cxx"
 PACKAGECONFIG[tests] = "--enable-tests,--disable-tests,kmod udev"
-
+PACKAGECONFIG[cxx] = "--enable-bindings-cxx,--disable-bindings-cxx"
 PACKAGECONFIG[python3] = "--enable-bindings-python,--disable-bindings-python,python3"
 
-inherit python3native
+# Enable cxx bindings by default.
+PACKAGECONFIG ?= "cxx"
+
+# Always build tools - they don't have any additional
+# requirements over the library.
+EXTRA_OECONF = "--enable-tools"
+
+DEPENDS += "autoconf-archive-native"
+
+PACKAGES =+ "${PN}-tools libgpiodcxx"
+FILES_${PN}-tools = "${bindir}/*"
+FILES_libgpiodcxx = "${libdir}/libgpiodcxx.so.*"
 
 PACKAGES =+ "${PN}-python"
 FILES_${PN}-python = "${PYTHON_SITEPACKAGES_DIR}"
diff --git a/meta-openembedded/meta-oe/recipes-support/libssh2/files/run-ptest b/meta-openembedded/meta-oe/recipes-support/libssh2/files/run-ptest
new file mode 100644
index 0000000..2a7922f
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/libssh2/files/run-ptest
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+ptestdir=$(dirname "$(readlink -f "$0")")
+for test in $(ls $ptestdir/tests)
+do
+	./test-driver --test-name $test --log-file $test.log --trs-file $test.trs --color-tests no --enable-hard-errors yes --expect-failure no -- ./tests/$test
+done
diff --git a/meta-openembedded/meta-oe/recipes-support/libssh2/libssh2_1.9.0.bb b/meta-openembedded/meta-oe/recipes-support/libssh2/libssh2_1.9.0.bb
index c1f337a..a1d8561 100644
--- a/meta-openembedded/meta-oe/recipes-support/libssh2/libssh2_1.9.0.bb
+++ b/meta-openembedded/meta-oe/recipes-support/libssh2/libssh2_1.9.0.bb
@@ -9,11 +9,12 @@
 
 SRC_URI = "http://www.libssh2.org/download/${BP}.tar.gz \
            file://CVE-2019-17498.patch \
+           file://run-ptest \
 "
 SRC_URI[md5sum] = "1beefafe8963982adc84b408b2959927"
 SRC_URI[sha256sum] = "d5fb8bd563305fd1074dda90bd053fb2d29fc4bce048d182f96eaa466dfadafd"
 
-inherit autotools pkgconfig
+inherit autotools pkgconfig ptest
 
 EXTRA_OECONF += "\
                  --with-libz \
@@ -26,3 +27,17 @@
 PACKAGECONFIG[gcrypt] = "--with-crypto=libgcrypt --with-libgcrypt-prefix=${STAGING_EXECPREFIXDIR}, , libgcrypt"
 
 BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS_${PN}-ptest = "bash"
+
+do_compile_ptest() {
+	sed -i "/\$(MAKE) \$(AM_MAKEFLAGS) check-TESTS/d" tests/Makefile
+	oe_runmake check
+}
+
+do_install_ptest() {
+	install -d ${D}${PTEST_PATH}/tests
+	install -m 0755 ${B}/tests/.libs/simple ${D}${PTEST_PATH}/tests/
+	install -m 0755 ${S}/tests/mansyntax.sh ${D}${PTEST_PATH}/tests/
+	install -m 0755 ${S}/test-driver ${D}${PTEST_PATH}/
+}
diff --git a/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0032-libdmmp-Makefile-replace-perl-with-sed-in-install-ta.patch b/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0032-libdmmp-Makefile-replace-perl-with-sed-in-install-ta.patch
new file mode 100644
index 0000000..b35d67c
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0032-libdmmp-Makefile-replace-perl-with-sed-in-install-ta.patch
@@ -0,0 +1,40 @@
+From 35421d03898ac1b38f97a76241e6a29086d0c9f1 Mon Sep 17 00:00:00 2001
+From: Geoff Parker <geoffrey.parker@arthrex.com>
+Date: Fri, 9 Oct 2020 17:48:47 +0000
+Subject: [PATCH] libdmmp/Makefile: replace perl with sed in install target to
+ work with pseudo
+
+The multipath-tools libdmmp/Makefile install target uses 'perl -i' instead
+of 'sed -i' for string substitutions. The perl method creates a temporary file
+and overwrites the original which changes the inodes and corrupts the pseudo
+db. Changes to pseduo cause a build abort rather than allow possible bad
+ownership or permissions settings on the files. 'sed -i' is compatible
+with pseudo.
+
+Signed-off-by: Geoff Parker <geoffrey.parker@arthrex.com>
+---
+ libdmmp/Makefile | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/libdmmp/Makefile b/libdmmp/Makefile
+index 1dd3f340..8166075c 100644
+--- a/libdmmp/Makefile
++++ b/libdmmp/Makefile
+@@ -34,11 +34,11 @@ install:
+ 	$(LN) $(LIBS) $(DESTDIR)$(usrlibdir)/$(DEVLIB)
+ 	$(INSTALL_PROGRAM) -m 644 -D \
+ 		$(PKGFILE).in $(DESTDIR)$(pkgconfdir)/$(PKGFILE)
+-	perl -i -pe 's|__VERSION__|$(LIBDMMP_VERSION)|g' \
++	sed -i 's|__VERSION__|$(LIBDMMP_VERSION)|g' \
+ 		$(DESTDIR)$(pkgconfdir)/$(PKGFILE)
+-	perl -i -pe 's|__LIBDIR__|$(usrlibdir)|g' \
++	sed -i 's|__LIBDIR__|$(usrlibdir)|g' \
+ 		$(DESTDIR)$(pkgconfdir)/$(PKGFILE)
+-	perl -i -pe 's|__INCLUDEDIR__|$(includedir)|g' \
++	sed -i 's|__INCLUDEDIR__|$(includedir)|g' \
+ 		$(DESTDIR)$(pkgconfdir)/$(PKGFILE)
+ 	@for file in docs/man/*.3.gz; do \
+ 		$(INSTALL_PROGRAM) -m 644 -D \
+-- 
+2.20.1
+
diff --git a/meta-openembedded/meta-oe/recipes-support/multipath-tools/multipath-tools_0.8.4.bb b/meta-openembedded/meta-oe/recipes-support/multipath-tools/multipath-tools_0.8.4.bb
index 48a348d..331c0cd 100644
--- a/meta-openembedded/meta-oe/recipes-support/multipath-tools/multipath-tools_0.8.4.bb
+++ b/meta-openembedded/meta-oe/recipes-support/multipath-tools/multipath-tools_0.8.4.bb
@@ -43,6 +43,7 @@
            file://0029-multipath-tools-modify-Makefile.inc-for-cross-compil.patch \
            file://0030-Always-use-devmapper.patch \
            file://0031-Always-use-devmapper-for-kpartx.patch \
+           file://0032-libdmmp-Makefile-replace-perl-with-sed-in-install-ta.patch \
            file://0001-fix-bug-of-do_compile-and-do_install.patch \
            file://0001-add-explicit-dependency-on-libraries.patch \
            file://0001-fix-boolean-value-with-json-c-0.14.patch \
diff --git a/meta-openembedded/meta-oe/recipes-support/numactl/numactl/0001-numademo-fix-error-on-32bit-system.patch b/meta-openembedded/meta-oe/recipes-support/numactl/numactl/0001-numademo-fix-error-on-32bit-system.patch
deleted file mode 100644
index 5061017..0000000
--- a/meta-openembedded/meta-oe/recipes-support/numactl/numactl/0001-numademo-fix-error-on-32bit-system.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From 68485f8516884377e54c623b0deff73f97321d96 Mon Sep 17 00:00:00 2001
-From: "Hongzhi.Song" <hongzhi.song@windriver.com>
-Date: Thu, 19 Sep 2019 04:32:31 -0400
-Subject: [PATCH] numademo: fix error on 32bit system
-
-Error Info on 32bit:
-root@intel-x86:~# numademo -t -e 1M
-Configured Nodes does not match available memory nodes
-
-That's because sizeof(long)=4Word, but sizeof(long long)=8Word
-on 32bit. So (long long) assigning to (long) maybe cause overflow.
-
-long numa_node_size(int node, long *freep)
-{
-    ...
-    long sz = numa_node_size64_int(node, &f2);
-    ~^^~
-    return sz;
-    ...
-}
-long long numa_node_size64(int node, long long *freep)
-~^^   ^^~
-{
-    ...
-}
-
-Unify the return type of above functions.
-
-Upstream-Status: Accepted [next version is after 2.0.13 or 2.0.14]
-[https://github.com/numactl/numactl/commit/a7c4bc790a191d3e42b63850b409c1a72b75a4e1]
-                 Submitted [https://github.com/numactl/numactl/pull/79]
-[The first patch was merged but has a error, then the second fix it.]
-
-Signed-off-by: Hongzhi.Song <hongzhi.song@windriver.com>
----
- libnuma.c         | 4 ++--
- numa.h            | 2 +-
- numademo.c        | 2 +-
- test/move_pages.c | 2 +-
- 4 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/libnuma.c b/libnuma.c
-index cac8851..8b5c6aa 100644
---- a/libnuma.c
-+++ b/libnuma.c
-@@ -791,10 +791,10 @@ long long numa_node_size64(int node, long long *freep)
- 
- make_internal_alias(numa_node_size64);
- 
--long numa_node_size(int node, long *freep)
-+long long numa_node_size(int node, long long *freep)
- {
- 	long long f2;
--	long sz = numa_node_size64_int(node, &f2);
-+	long long sz = numa_node_size64_int(node, &f2);
- 	if (freep)
- 		*freep = f2;
- 	return sz;
-diff --git a/numa.h b/numa.h
-index 3a8c543..268fb1d 100644
---- a/numa.h
-+++ b/numa.h
-@@ -143,7 +143,7 @@ int numa_preferred(void);
- 
- /* Return node size and free memory */
- long long numa_node_size64(int node, long long *freep);
--long numa_node_size(int node, long *freep);
-+long long numa_node_size(int node, long long *freep);
- 
- int numa_pagesize(void);
- 
-diff --git a/numademo.c b/numademo.c
-index a720db0..8c56da8 100644
---- a/numademo.c
-+++ b/numademo.c
-@@ -301,7 +301,7 @@ int max_node, numnodes;
- int get_node_list(void)
- {
-         int a, got_nodes = 0;
--        long free_node_sizes;
-+        long long free_node_sizes;
- 
-         numnodes = numa_num_configured_nodes();
-         node_to_use = (int *)malloc(numnodes * sizeof(int));
-diff --git a/test/move_pages.c b/test/move_pages.c
-index d1d8436..f8ff25d 100644
---- a/test/move_pages.c
-+++ b/test/move_pages.c
-@@ -26,7 +26,7 @@ int *node_to_use;
- int get_node_list()
- {
-         int a, got_nodes = 0, max_node, numnodes;
--        long free_node_sizes;
-+        long long free_node_sizes;
- 
-         numnodes = numa_num_configured_nodes();
-         node_to_use = (int *)malloc(numnodes * sizeof(int));
--- 
-2.23.0
-
diff --git a/meta-openembedded/meta-oe/recipes-support/numactl/numactl_git.bb b/meta-openembedded/meta-oe/recipes-support/numactl/numactl_git.bb
index 20b7fed..504fe03 100644
--- a/meta-openembedded/meta-oe/recipes-support/numactl/numactl_git.bb
+++ b/meta-openembedded/meta-oe/recipes-support/numactl/numactl_git.bb
@@ -10,15 +10,14 @@
 
 LIC_FILES_CHKSUM = "file://README.md;beginline=19;endline=32;md5=f8ff2391624f28e481299f3f677b21bb"
 
-SRCREV = "5d9f16722e3df49dc618a9f361bd482559695db7"
-PV = "2.0.13+git${SRCPV}"
+SRCREV = "dd6de072c92c892a86e18c0fd0dfa1ba57a9a05d"
+PV = "2.0.14+git${SRCPV}"
 
 SRC_URI = "git://github.com/numactl/numactl \
     file://Fix-the-test-output-format.patch \
     file://Makefile \
     file://run-ptest \
     file://0001-define-run-test-target.patch \
-    file://0001-numademo-fix-error-on-32bit-system.patch \
 "
 
 S = "${WORKDIR}/git"
@@ -26,6 +25,9 @@
 # ARM does not currently support NUMA
 COMPATIBLE_HOST = "^((?!arm).*)$"
 
+LDFLAGS_append_riscv64 = " -latomic"
+LDFLAGS_append_riscv32 = " -latomic"
+
 do_install() {
     oe_runmake DESTDIR=${D} prefix=${D}/usr install
     #remove the empty man2 directory
diff --git a/meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.8.26.bb b/meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.9.0.bb
similarity index 92%
rename from meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.8.26.bb
rename to meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.9.0.bb
index 91d77ac..6f38d65 100644
--- a/meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.8.26.bb
+++ b/meta-openembedded/meta-oe/recipes-support/pcsc-lite/pcsc-lite_1.9.0.bb
@@ -14,8 +14,8 @@
 	https://pcsclite.apdu.fr/files/${BP}.tar.bz2 \
 	file://0001-pcsc-spy-use-python3-only.patch \
 "
-SRC_URI[md5sum] = "9d36882998449daceec267c68a21ff0d"
-SRC_URI[sha256sum] = "3eb7be7d6ef618c0a444316cf5c1f2f9d7227aedba7a192f389fe3e7c0dfbbd9"
+SRC_URI[md5sum] = "eb595f2d398ff229207a6ec09fbc4e98"
+SRC_URI[sha256sum] = "0148d403137124552c5d0f10f8cdab2cbb8dfc7c6ce75e018faf667be34f2ef9"
 
 inherit autotools systemd pkgconfig perlnative
 
diff --git a/meta-openembedded/meta-oe/recipes-support/tbb/tbb/improve-reproducibility.patch b/meta-openembedded/meta-oe/recipes-support/tbb/tbb/improve-reproducibility.patch
new file mode 100644
index 0000000..91d10cb
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/tbb/tbb/improve-reproducibility.patch
@@ -0,0 +1,30 @@
+From f56eeb18a07df139864a99e1967d450cc5c8c0bb Mon Sep 17 00:00:00 2001
+From: Lee Chee Yang <chee.yang.lee@intel.com>
+Date: Wed, 30 Sep 2020 16:18:35 +0800
+Subject: [PATCH] improve reproducibility
+
+remove the WORKDIR info from BUILD_COMMAND to improve reproducibility.
+also use SOURCE_DATE_EPOCH as DATETIME wherever possible.
+
+Upstream-Status: Inappropriate [sed WORKDIR does not applies to upstream]
+Signed-off-by: Lee Chee Yang <chee.yang.lee@intel.com>
+---
+ build/version_info_linux.sh | 4 +-
+ 1 file changed, 2 insertion(+), 2 deletion(-)
+
+diff --git a/build/version_info_linux.sh b/build/version_info_linux.sh
+index 793cad11..ed6f4b2a 100644
+--- a/build/version_info_linux.sh
++++ b/build/version_info_linux.sh
+@@ -25,6 +25,6 @@ echo '#N": BUILD_GCC'"\t\t"`g++ --version </dev/null 2>&1 | grep 'g++'`'" ENDL \
+ echo '#N": BUILD_LIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
+ echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \'
+ echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \'
+-echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \'
++echo '#N": BUILD_COMMAND'"\t"$(echo $* | sed 's#'$WORKDIR'#/workdir#g')'" ENDL \'
+ echo ""
+-echo "#define __TBB_DATETIME \""`date -u`"\""
++echo "#define __TBB_DATETIME \""`$(date -u -d "@$SOURCE_DATE_EPOCH"  2>/dev/null || date -u -r "$SOURCE_DATE_EPOCH"  2>/dev/null || date -u )`"\""
+-- 
+2.25.1
+
diff --git a/meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.2.bb b/meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.3.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.2.bb
rename to meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.3.bb
index 2f9fd7f..8e0094b 100644
--- a/meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.2.bb
+++ b/meta-openembedded/meta-oe/recipes-support/tbb/tbb_2020.3.bb
@@ -7,12 +7,13 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
 BRANCH = "tbb_2020"
-SRCREV = "60b7d0a78f8910976678ba63a19fdaee22c0ef65"
+SRCREV = "eca91f16d7490a8abfdee652dadf457ec820cc37"
 SRC_URI = "git://github.com/oneapi-src/oneTBB.git;protocol=https;branch=${BRANCH} \
            file://cross-compile.patch \
            file://0001-mallinfo-is-glibc-specific-API-mark-it-so.patch \
            file://GLIBC-PREREQ-is-not-defined-on-musl.patch \
            file://tbb.pc \
+           file://improve-reproducibility.patch \
 "
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-evemu_git.bb b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-evemu_git.bb
index 7c5a734..a5a881d 100644
--- a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-evemu_git.bb
+++ b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-evemu_git.bb
@@ -14,6 +14,6 @@
 
 PV = "1.0.6+git${SRCPV}"
 
-S = "${WORKDIR}/git/"
+S = "${WORKDIR}/git"
 
 PARALLEL_MAKE = ""
diff --git a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-frame_git.bb b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-frame_git.bb
index 1ebebfa..ca74d91 100644
--- a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-frame_git.bb
+++ b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-frame_git.bb
@@ -18,4 +18,4 @@
 
 PV = "1.1.2+git${SRCPV}"
 
-S = "${WORKDIR}/git/"
+S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-mtview_git.bb b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-mtview_git.bb
index 5f07bf2..04d1f3f 100644
--- a/meta-openembedded/meta-oe/recipes-support/utouch/utouch-mtview_git.bb
+++ b/meta-openembedded/meta-oe/recipes-support/utouch/utouch-mtview_git.bb
@@ -16,4 +16,4 @@
 
 PV = "1.1.7+git${SRCPV}"
 
-S = "${WORKDIR}/git/"
+S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/021-linux-5-8.patch b/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/021-linux-5-8.patch
deleted file mode 100644
index 9d45750..0000000
--- a/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/021-linux-5-8.patch
+++ /dev/null
@@ -1,5046 +0,0 @@
-fix Linux 5.8
-
-This is a squashed patch with following upstream revisions:
-
-  r85208
-  r85430
-  r85431
-  r85432
-  r85447 # context required adjustment
-  r85453
-  r85460
-  r85461 # context required adjustment
-  r85500
-  r85501
-  r85503
-  r85504
-  r85505
-  r85506
-  r85507 # context required adjustment
-  r85509
-  r85510
-  r85511
-  r85514
-  r85516
-  r85517
-  r85518
-  r85525
-  r85526
-  r85527
-  r85533
-  r85534
-  r85540
-  r85541
-  r85545
-  r85546
-  r85552
-  r85555
-  r85556
-  r85590
-
-Thanks a lot to loqs for his hard work on FS#67488!
-
---- a/src/VBox/Runtime/r0drv/linux/time-r0drv-linux.c
-+++ b/src/VBox/Runtime/r0drv/linux/time-r0drv-linux.c
-@@ -31,6 +31,12 @@
- #define LOG_GROUP RTLOGGROUP_TIME
- #include "the-linux-kernel.h"
- #include "internal/iprt.h"
-+/* Make sure we have the setting functions we need for RTTimeNow: */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
-+# define RTTIME_INCL_TIMEVAL
-+#elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-+# define RTTIME_INCL_TIMESPEC
-+#endif
- #include <iprt/time.h>
- #include <iprt/asm.h>
- 
-@@ -181,22 +187,19 @@ RT_EXPORT_SYMBOL(RTTimeSystemMilliTS);
- RTDECL(PRTTIMESPEC) RTTimeNow(PRTTIMESPEC pTime)
- {
-     IPRT_LINUX_SAVE_EFL_AC();
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
--/* On Linux 4.20, time.h includes time64.h and we have to use 64-bit times. */
--# ifdef _LINUX_TIME64_H
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
-     struct timespec64 Ts;
--    ktime_get_real_ts64(&Ts);
--# else
--    struct timespec Ts;
--    ktime_get_real_ts(&Ts);
--# endif
-+    ktime_get_real_ts64(&Ts);   /* ktime_get_real_ts64 was added as a macro in 3.17, function since 4.18. */
-     IPRT_LINUX_RESTORE_EFL_AC();
--# ifdef _LINUX_TIME64_H
-     return RTTimeSpecSetTimespec64(pTime, &Ts);
--# else
-+
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
-+    struct timespec Ts;
-+    ktime_get_real_ts(&Ts);     /* ktime_get_real_ts was removed in Linux 4.20. */
-+    IPRT_LINUX_RESTORE_EFL_AC();
-     return RTTimeSpecSetTimespec(pTime, &Ts);
--# endif
--#else   /* < 2.6.16 */
-+
-+#else /* < 2.6.16 */
-     struct timeval Tv;
-     do_gettimeofday(&Tv);
-     IPRT_LINUX_RESTORE_EFL_AC();
---- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
-+++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
-@@ -52,6 +52,14 @@
- # define PAGE_READONLY_EXEC PAGE_READONLY
- #endif
- 
-+/** @def IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+ * Whether we use alloc_vm_area (3.2+) for executable memory.
-+ * This is a must for 5.8+, but we enable it all the way back to 3.2.x for
-+ * better W^R compliance (fExecutable flag). */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) || defined(DOXYGEN_RUNNING)
-+# define IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+#endif
-+
- /*
-  * 2.6.29+ kernels don't work with remap_pfn_range() anymore because
-  * track_pfn_vma_new() is apparently not defined for non-RAM pages.
-@@ -72,12 +80,27 @@
- # define gfp_t  unsigned
- #endif
- 
-+/*
-+ * Wrappers around mmap_lock/mmap_sem difference.
-+ */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
-+# define LNX_MM_DOWN_READ(a_pMm)    down_read(&(a_pMm)->mmap_lock)
-+# define LNX_MM_UP_READ(a_pMm)        up_read(&(a_pMm)->mmap_lock)
-+# define LNX_MM_DOWN_WRITE(a_pMm)   down_write(&(a_pMm)->mmap_lock)
-+# define LNX_MM_UP_WRITE(a_pMm)       up_write(&(a_pMm)->mmap_lock)
-+#else
-+# define LNX_MM_DOWN_READ(a_pMm)    down_read(&(a_pMm)->mmap_sem)
-+# define LNX_MM_UP_READ(a_pMm)        up_read(&(a_pMm)->mmap_sem)
-+# define LNX_MM_DOWN_WRITE(a_pMm)   down_write(&(a_pMm)->mmap_sem)
-+# define LNX_MM_UP_WRITE(a_pMm)       up_write(&(a_pMm)->mmap_sem)
-+#endif
-+
- 
- /*********************************************************************************************************************************
- *   Structures and Typedefs                                                                                                      *
- *********************************************************************************************************************************/
- /**
-- * The Darwin version of the memory object structure.
-+ * The Linux version of the memory object structure.
-  */
- typedef struct RTR0MEMOBJLNX
- {
-@@ -90,11 +113,20 @@ typedef struct RTR0MEMOBJLNX
-     bool                fExecutable;
-     /** Set if we've vmap'ed the memory into ring-0. */
-     bool                fMappedToRing0;
-+#ifdef IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+    /** Return from alloc_vm_area() that we now need to use for executable
-+     *  memory. */
-+    struct vm_struct   *pArea;
-+    /** PTE array that goes along with pArea (must be freed). */
-+    pte_t             **papPtesForArea;
-+#endif
-     /** The pages in the apPages array. */
-     size_t              cPages;
-     /** Array of struct page pointers. (variable size) */
-     struct page        *apPages[1];
--} RTR0MEMOBJLNX, *PRTR0MEMOBJLNX;
-+} RTR0MEMOBJLNX;
-+/** Pointer to the linux memory object. */
-+typedef RTR0MEMOBJLNX *PRTR0MEMOBJLNX;
- 
- 
- static void rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx);
-@@ -182,7 +214,7 @@ static pgprot_t rtR0MemObjLinuxConvertPr
-  * Worker for rtR0MemObjNativeReserveUser and rtR0MemObjNativerMapUser that creates
-  * an empty user space mapping.
-  *
-- * We acquire the mmap_sem of the task!
-+ * We acquire the mmap_sem/mmap_lock of the task!
-  *
-  * @returns Pointer to the mapping.
-  *          (void *)-1 on failure.
-@@ -222,9 +254,9 @@ static void *rtR0MemObjLinuxDoMmap(RTR3P
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
-         ulAddr = vm_mmap(NULL, R3PtrFixed, cb, fLnxProt, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, 0);
- #else
--        down_write(&pTask->mm->mmap_sem);
-+        LNX_MM_DOWN_WRITE(pTask->mm);
-         ulAddr = do_mmap(NULL, R3PtrFixed, cb, fLnxProt, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, 0);
--        up_write(&pTask->mm->mmap_sem);
-+        LNX_MM_UP_WRITE(pTask->mm);
- #endif
-     }
-     else
-@@ -232,9 +264,9 @@ static void *rtR0MemObjLinuxDoMmap(RTR3P
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
-         ulAddr = vm_mmap(NULL, 0, cb, fLnxProt, MAP_SHARED | MAP_ANONYMOUS, 0);
- #else
--        down_write(&pTask->mm->mmap_sem);
-+        LNX_MM_DOWN_WRITE(pTask->mm);
-         ulAddr = do_mmap(NULL, 0, cb, fLnxProt, MAP_SHARED | MAP_ANONYMOUS, 0);
--        up_write(&pTask->mm->mmap_sem);
-+        LNX_MM_UP_WRITE(pTask->mm);
- #endif
-         if (    !(ulAddr & ~PAGE_MASK)
-             &&  (ulAddr & (uAlignment - 1)))
-@@ -257,7 +289,7 @@ static void *rtR0MemObjLinuxDoMmap(RTR3P
-  * Worker that destroys a user space mapping.
-  * Undoes what rtR0MemObjLinuxDoMmap did.
-  *
-- * We acquire the mmap_sem of the task!
-+ * We acquire the mmap_sem/mmap_lock of the task!
-  *
-  * @param   pv          The ring-3 mapping.
-  * @param   cb          The size of the mapping.
-@@ -269,13 +301,13 @@ static void rtR0MemObjLinuxDoMunmap(void
-     Assert(pTask == current); RT_NOREF_PV(pTask);
-     vm_munmap((unsigned long)pv, cb);
- #elif defined(USE_RHEL4_MUNMAP)
--    down_write(&pTask->mm->mmap_sem);
-+    LNX_MM_DOWN_WRITE(pTask->mm);
-     do_munmap(pTask->mm, (unsigned long)pv, cb, 0); /* should it be 1 or 0? */
--    up_write(&pTask->mm->mmap_sem);
-+    LNX_MM_UP_WRITE(pTask->mm);
- #else
--    down_write(&pTask->mm->mmap_sem);
-+    LNX_MM_DOWN_WRITE(pTask->mm);
-     do_munmap(pTask->mm, (unsigned long)pv, cb);
--    up_write(&pTask->mm->mmap_sem);
-+    LNX_MM_UP_WRITE(pTask->mm);
- #endif
- }
- 
-@@ -520,15 +552,49 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMO
-             pgprot_val(fPg) |= _PAGE_NX;
- # endif
- 
-+# ifdef IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+        if (fExecutable)
-+        {
-+            pte_t **papPtes = (pte_t **)kmalloc_array(pMemLnx->cPages, sizeof(papPtes[0]), GFP_KERNEL);
-+            if (papPtes)
-+            {
-+                pMemLnx->pArea = alloc_vm_area(pMemLnx->Core.cb, papPtes); /* Note! pArea->nr_pages is not set. */
-+                if (pMemLnx->pArea)
-+                {
-+                    size_t i;
-+                    Assert(pMemLnx->pArea->size >= pMemLnx->Core.cb);   /* Note! includes guard page. */
-+                    Assert(pMemLnx->pArea->addr);
-+#  ifdef _PAGE_NX
-+                    pgprot_val(fPg) |= _PAGE_NX; /* Uses RTR0MemObjProtect to clear NX when memory ready, W^X fashion. */
-+#  endif
-+                    pMemLnx->papPtesForArea = papPtes;
-+                    for (i = 0; i < pMemLnx->cPages; i++)
-+                        *papPtes[i] = mk_pte(pMemLnx->apPages[i], fPg);
-+                    pMemLnx->Core.pv = pMemLnx->pArea->addr;
-+                    pMemLnx->fMappedToRing0 = true;
-+                }
-+                else
-+                {
-+                    kfree(papPtes);
-+                    rc = VERR_MAP_FAILED;
-+                }
-+            }
-+            else
-+                rc = VERR_MAP_FAILED;
-+        }
-+        else
-+# endif
-+        {
- # ifdef VM_MAP
--        pMemLnx->Core.pv = vmap(&pMemLnx->apPages[0], pMemLnx->cPages, VM_MAP, fPg);
-+            pMemLnx->Core.pv = vmap(&pMemLnx->apPages[0], pMemLnx->cPages, VM_MAP, fPg);
- # else
--        pMemLnx->Core.pv = vmap(&pMemLnx->apPages[0], pMemLnx->cPages, VM_ALLOC, fPg);
-+            pMemLnx->Core.pv = vmap(&pMemLnx->apPages[0], pMemLnx->cPages, VM_ALLOC, fPg);
- # endif
--        if (pMemLnx->Core.pv)
--            pMemLnx->fMappedToRing0 = true;
--        else
--            rc = VERR_MAP_FAILED;
-+            if (pMemLnx->Core.pv)
-+                pMemLnx->fMappedToRing0 = true;
-+            else
-+                rc = VERR_MAP_FAILED;
-+        }
- #else   /* < 2.4.22 */
-         rc = VERR_NOT_SUPPORTED;
- #endif
-@@ -554,6 +620,22 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMO
- static void rtR0MemObjLinuxVUnmap(PRTR0MEMOBJLNX pMemLnx)
- {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 22)
-+# ifdef IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+    if (pMemLnx->pArea)
-+    {
-+#  if 0
-+        pte_t **papPtes = pMemLnx->papPtesForArea;
-+        size_t  i;
-+        for (i = 0; i < pMemLnx->cPages; i++)
-+            *papPtes[i] = 0;
-+#  endif
-+        free_vm_area(pMemLnx->pArea);
-+        kfree(pMemLnx->papPtesForArea);
-+        pMemLnx->pArea = NULL;
-+        pMemLnx->papPtesForArea = NULL;
-+    }
-+    else
-+# endif
-     if (pMemLnx->fMappedToRing0)
-     {
-         Assert(pMemLnx->Core.pv);
-@@ -593,7 +675,7 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR
-                 size_t              iPage;
-                 Assert(pTask);
-                 if (pTask && pTask->mm)
--                    down_read(&pTask->mm->mmap_sem);
-+                    LNX_MM_DOWN_READ(pTask->mm);
- 
-                 iPage = pMemLnx->cPages;
-                 while (iPage-- > 0)
-@@ -608,7 +690,7 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR
-                 }
- 
-                 if (pTask && pTask->mm)
--                    up_read(&pTask->mm->mmap_sem);
-+                    LNX_MM_UP_READ(pTask->mm);
-             }
-             /* else: kernel memory - nothing to do here. */
-             break;
-@@ -1076,7 +1158,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser
-     papVMAs = (struct vm_area_struct **)RTMemAlloc(sizeof(*papVMAs) * cPages);
-     if (papVMAs)
-     {
--        down_read(&pTask->mm->mmap_sem);
-+        LNX_MM_DOWN_READ(pTask->mm);
- 
-         /*
-          * Get user pages.
-@@ -1162,7 +1244,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser
-                 papVMAs[rc]->vm_flags |= VM_DONTCOPY | VM_LOCKED;
-             }
- 
--            up_read(&pTask->mm->mmap_sem);
-+            LNX_MM_UP_READ(pTask->mm);
- 
-             RTMemFree(papVMAs);
- 
-@@ -1189,7 +1271,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser
- #endif
-         }
- 
--        up_read(&pTask->mm->mmap_sem);
-+        LNX_MM_UP_READ(pTask->mm);
- 
-         RTMemFree(papVMAs);
-         rc = VERR_LOCK_FAILED;
-@@ -1422,6 +1504,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKerne
-              * Use vmap - 2.4.22 and later.
-              */
-             pgprot_t fPg = rtR0MemObjLinuxConvertProt(fProt, true /* kernel */);
-+            /** @todo We don't really care too much for EXEC here... 5.8 always adds NX. */
-             Assert(((offSub + cbSub) >> PAGE_SHIFT) <= pMemLnxToMap->cPages);
- # ifdef VM_MAP
-             pMemLnx->Core.pv = vmap(&pMemLnxToMap->apPages[offSub >> PAGE_SHIFT], cbSub >> PAGE_SHIFT, VM_MAP, fPg);
-@@ -1604,7 +1687,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
-             const size_t    cPages    = (offSub + cbSub) >> PAGE_SHIFT;
-             size_t          iPage;
- 
--            down_write(&pTask->mm->mmap_sem);
-+            LNX_MM_DOWN_WRITE(pTask->mm);
- 
-             rc = VINF_SUCCESS;
-             if (pMemLnxToMap->cPages)
-@@ -1721,7 +1804,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
-             }
- #endif /* CONFIG_NUMA_BALANCING */
- 
--            up_write(&pTask->mm->mmap_sem);
-+            LNX_MM_UP_WRITE(pTask->mm);
- 
-             if (RT_SUCCESS(rc))
-             {
-@@ -1753,6 +1836,29 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
- 
- DECLHIDDEN(int) rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub, size_t cbSub, uint32_t fProt)
- {
-+# ifdef IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
-+    /*
-+     * Currently only supported when we've got addresses PTEs from the kernel.
-+     */
-+    PRTR0MEMOBJLNX pMemLnx = (PRTR0MEMOBJLNX)pMem;
-+    if (pMemLnx->pArea && pMemLnx->papPtesForArea)
-+    {
-+        pgprot_t const  fPg     = rtR0MemObjLinuxConvertProt(fProt, true /*fKernel*/);
-+        size_t const    cPages  = (offSub + cbSub) >> PAGE_SHIFT;
-+        pte_t         **papPtes = pMemLnx->papPtesForArea;
-+        size_t          i;
-+
-+        for (i = offSub >> PAGE_SHIFT; i < cPages; i++)
-+        {
-+            set_pte(papPtes[i], mk_pte(pMemLnx->apPages[i], fPg));
-+        }
-+        preempt_disable();
-+        __flush_tlb_all();
-+        preempt_enable();
-+        return VINF_SUCCESS;
-+    }
-+# endif
-+
-     NOREF(pMem);
-     NOREF(offSub);
-     NOREF(cbSub);
---- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
-+++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
-@@ -144,9 +144,9 @@ static int force_async_tsc = 0;
-  * Memory for the executable memory heap (in IPRT).
-  */
- # ifdef DEBUG
--#  define EXEC_MEMORY_SIZE   8388608    /* 8 MB */
-+#  define EXEC_MEMORY_SIZE   10485760   /* 10 MB */
- # else
--#  define EXEC_MEMORY_SIZE   2097152    /* 2 MB */
-+#  define EXEC_MEMORY_SIZE   8388608    /* 8 MB */
- # endif
- extern uint8_t g_abExecMemory[EXEC_MEMORY_SIZE];
- # ifndef VBOX_WITH_TEXT_MODMEM_HACK
-@@ -756,20 +756,25 @@ EXPORT_SYMBOL(SUPDrvLinuxIDC);
- 
- RTCCUINTREG VBOXCALL supdrvOSChangeCR4(RTCCUINTREG fOrMask, RTCCUINTREG fAndMask)
- {
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 20, 0)
--    RTCCUINTREG uOld = this_cpu_read(cpu_tlbstate.cr4);
--    RTCCUINTREG uNew = (uOld & fAndMask) | fOrMask;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
-+    RTCCUINTREG const uOld = __read_cr4();
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 20, 0)
-+    RTCCUINTREG const uOld = this_cpu_read(cpu_tlbstate.cr4);
-+#else
-+    RTCCUINTREG const uOld = ASMGetCR4();
-+#endif
-+    RTCCUINTREG const uNew = (uOld & fAndMask) | fOrMask;
-     if (uNew != uOld)
-     {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
-+        ASMSetCR4(uNew);
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 20, 0)
-         this_cpu_write(cpu_tlbstate.cr4, uNew);
-         __write_cr4(uNew);
--    }
- #else
--    RTCCUINTREG uOld = ASMGetCR4();
--    RTCCUINTREG uNew = (uOld & fAndMask) | fOrMask;
--    if (uNew != uOld)
-         ASMSetCR4(uNew);
- #endif
-+    }
-     return uOld;
- }
- 
---- a/src/VBox/Additions/linux/sharedfolders/vfsmod.c
-+++ b/src/VBox/Additions/linux/sharedfolders/vfsmod.c
-@@ -52,7 +52,7 @@
- #endif
- #include <linux/seq_file.h>
- #include <linux/vfs.h>
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 62)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 62) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)
- # include <linux/vermagic.h>
- #endif
- #include <VBox/err.h>
---- a/Config.kmk
-+++ b/Config.kmk
-@@ -4462,15 +4462,20 @@ endif # pe
- 
- ifeq ($(VBOX_LDR_FMT),elf)
- TEMPLATE_VBoxR0_TOOL                = $(VBOX_GCC_TOOL)
--TEMPLATE_VBoxR0_CFLAGS              = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C)   $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK)
--TEMPLATE_VBoxR0_CXXFLAGS            = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) -fno-rtti $(VBOX_GCC_IPRT_FMT_CHECK)
--TEMPLATE_VBoxR0_CFLAGS.amd64        = -m64 -mno-red-zone -mcmodel=kernel -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding
--TEMPLATE_VBoxR0_CXXFLAGS.amd64      = -m64 -mno-red-zone -mcmodel=kernel -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables
-+TEMPLATE_VBoxR0_CFLAGS              = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) \
-+	$(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
-+	$(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK)
-+TEMPLATE_VBoxR0_CXXFLAGS            = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) \
-+	$(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
-+	$(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
-+	-fno-rtti $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK)
-++TEMPLATE_VBoxR0_CFLAGS.amd64        = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding
-++TEMPLATE_VBoxR0_CXXFLAGS.amd64      = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables
- TEMPLATE_VBoxR0_CXXFLAGS.freebsd    = -ffreestanding
-  if $(VBOX_GCC_VERSION_CC) < 30400
-   TEMPLATE_VBoxR0_DEFS             += RT_WITHOUT_PRAGMA_ONCE
-  endif
--ifeq ($(KBUILD_TARGET),solaris)
-+ ifeq ($(KBUILD_TARGET),solaris)
-  TEMPLATE_VBoxR0_LDFLAGS            = -r
-  TEMPLATE_VBoxR0_LDFLAGS.solaris    = -u _init -u _info
-  TEMPLATE_VBoxR0_LIBS.solaris       = \
-@@ -4481,19 +4486,32 @@ ifeq ($(KBUILD_TARGET),solaris)
-  endif
-  # Solaris driver signing.
-  TEMPLATE_VBoxR0_POST_CMDS          = $(VBOX_SIGN_DRIVER_CMDS)
--else
-+ else
-  TEMPLATE_VBoxR0_LDFLAGS            = -nostdlib -Bsymbolic -g
-  ## @todo WTF doesn't the globals work? Debug info is supposed to be split everywhere. GRR
-  TEMPLATE_VBoxR0_LD_DEBUG           = split
--endif
--ifn1of ($(KBUILD_TARGET),solaris freebsd)
-+ endif
-+ if1of ($(KBUILD_TARGET), linux)
-+VBOX_WITH_VBOXR0_AS_DLL = 1
-+TEMPLATE_VBoxR0_DLLSUFF             = .r0
-+TEMPLATE_VBoxR0_CFLAGS             += -fPIC
-+TEMPLATE_VBoxR0_CXXFLAGS           += -fPIC
-+TEMPLATE_VBoxR0_LDFLAGS            +=
-+TEMPLATE_VBoxR0_DTRACE_HDR_FLAGS   += --pic
-+TEMPLATE_VBoxR0_DTRACE_OBJ_FLAGS   += --pic
-+ else
-+TEMPLATE_VBoxR0_CFLAGS.amd64       += -mcmodel=kernel
-+TEMPLATE_VBoxR0_CXXFLAGS.amd64     += -mcmodel=kernel
-+ endif
-+ ifn1of ($(KBUILD_TARGET),solaris freebsd)
-  TEMPLATE_VBoxR0_LIBS               = \
- 	$(VBOX_GCC_LIBGCC) # intrinsics
--endif
--if1of ($(KBUILD_TARGET),linux)
-- TEMPLATE_VBoxR0_POST_CMDS          =  $(if $(eq $(tool_do),LINK_SYSMOD),if readelf -S $(out)|grep -q "[cd]tors"; then echo "Found ctors/dtors in $(out)!"; exit 1; fi)
--endif
--endif
-+ endif
-+ if1of ($(KBUILD_TARGET),linux)
-+ TEMPLATE_VBoxR0_POST_CMDS         += $(NLTAB)\
-+ 	$(if $(eq $(tool_do),LINK_SYSMOD),if readelf -S $(out)|grep -q "[cd]tors"; then echo "Found ctors/dtors in $(out)!"; exit 1; fi)
-+ endif
-+endif # elf
- 
- ifeq ($(VBOX_LDR_FMT),macho)
- TEMPLATE_VBoxR0_TOOL                = $(VBOX_GCC_TOOL)
---- a/tools/bin/gen-slickedit-workspace.sh
-+++ b/tools/bin/gen-slickedit-workspace.sh
-@@ -496,11 +496,13 @@ my_generate_usercpp_h()
-     #
-     # Probe the slickedit user config, picking the most recent version.
-     #
-+    MY_VSLICK_DB_OLD=
-     if test -z "${MY_SLICK_CONFIG}"; then
-         if test -d "${HOME}/Library/Application Support/SlickEdit"; then
-             MY_SLICKDIR_="${HOME}/Library/Application Support/SlickEdit"
-             MY_USERCPP_H="unxcpp.h"
-             MY_VSLICK_DB="vslick.sta" # was .stu earlier, 24 is using .sta.
-+            MY_VSLICK_DB_OLD="vslick.stu"
-         elif test -d "${HOMEDRIVE}${HOMEPATH}/Documents/My SlickEdit Config"; then
-             MY_SLICKDIR_="${HOMEDRIVE}${HOMEPATH}/Documents/My SlickEdit Config"
-             MY_USERCPP_H="usercpp.h"
-@@ -508,7 +510,8 @@ my_generate_usercpp_h()
-         else
-             MY_SLICKDIR_="${HOME}/.slickedit"
-             MY_USERCPP_H="unxcpp.h"
--            MY_VSLICK_DB="vslick.stu"
-+            MY_VSLICK_DB="vslick.sta"
-+            MY_VSLICK_DB_OLD="vslick.stu"
-         fi
-     else
-         MY_SLICKDIR_="${MY_SLICK_CONFIG}"
-@@ -517,7 +520,8 @@ my_generate_usercpp_h()
-             MY_VSLICK_DB="vslick.sta"
-         else
-             MY_USERCPP_H="unxcpp.h"
--            MY_VSLICK_DB="vslick.stu"
-+            MY_VSLICK_DB="vslick.sta"
-+            MY_VSLICK_DB_OLD="vslick.stu"
-         fi
-         # MacOS: Implement me!
-     fi
-@@ -526,7 +530,9 @@ my_generate_usercpp_h()
-     MY_VER="0.0.0"
-     for subdir in "${MY_SLICKDIR_}/"*;
-     do
--        if test -f "${subdir}/${MY_USERCPP_H}"  -o  -f "${subdir}/${MY_VSLICK_DB}"; then
-+        if test    -f "${subdir}/${MY_USERCPP_H}"  \
-+                -o -f "${subdir}/${MY_VSLICK_DB}" \
-+                -o '(' -n "${MY_VSLICK_DB_OLD}" -a -f "${subdir}/${MY_VSLICK_DB_OLD}" ')'; then
-             MY_CUR_VER_NUM=0
-             MY_CUR_VER=`echo "${subdir}" | ${MY_SED} -e 's,^.*/,,g'`
- 
-@@ -561,6 +567,7 @@ my_generate_usercpp_h()
-         echo "Found SlickEdit v${MY_VER} preprocessor file: ${MY_USERCPP_H_FULL}"
-     else
-         echo "Failed to locate SlickEdit preprocessor file. You need to manually merge ${MY_USERCPP_H}."
-+        echo "dbg: MY_SLICKDIR=${MY_SLICKDIR}  MY_USERCPP_H_FULL=${MY_USERCPP_H_FULL}"
-         MY_USERCPP_H_FULL=""
-     fi
- 
-@@ -717,6 +724,10 @@ EOF
- #define RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm) int  a_ImplExtNm##_Init(P##a_TypeNm pThis, PCRTASN1ALLOCATORVTABLE pAllocator); int  a_ImplExtNm##_Clone(P##a_TypeNm pThis, PC##a_TypeNm) pSrc, PCRTASN1ALLOCATORVTABLE pAllocator); void a_ImplExtNm##_Delete(P##a_TypeNm pThis); int  a_ImplExtNm##_Enum(P##a_TypeNm pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser); int  a_ImplExtNm##_Compare(PC##a_TypeNm) pLeft, PC##a_TypeNm pRight); int  a_ImplExtNm##_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, P##a_TypeNm pThis, const char *pszErrorTag); int  a_ImplExtNm##_CheckSanity(PC##a_TypeNm pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
- #define RTASN1TYPE_STANDARD_PROTOTYPES(a_TypeNm, a_DeclMacro, a_ImplExtNm, a_Asn1CoreNm) inline PRTASN1CORE a_ImplExtNm##_GetAsn1Core(PC##a_TypeNm pThis) { return (PRTASN1CORE)&pThis->a_Asn1CoreNm; } inline bool a_ImplExtNm##_IsPresent(PC##a_TypeNm pThis) { return pThis && RTASN1CORE_IS_PRESENT(&pThis->a_Asn1CoreNm); } RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm)
- 
-+#define RTLDRELF_NAME(name)             rtldrELF64##name
-+#define RTLDRELF_SUFF(name)             name##64
-+#define RTLDRELF_MID(pre,suff)          pre##64##suff
-+
- #define BS3_DECL(type)                  type
- #define BS3_DECL_CALLBACK(type)         type
- #define TMPL_NM(name)                   name##_mmm
---- a/include/iprt/asmdefs.mac
-+++ b/include/iprt/asmdefs.mac
-@@ -841,18 +841,18 @@ size NAME(%1 %+ _EndProc)   0
- ; is defined and RT_WITHOUT_NOCRT_WRAPPERS isn't.
- ;
- %macro RT_NOCRT_BEGINPROC 1
--%ifdef RT_WITH_NOCRT_ALIASES
--BEGINPROC RT_NOCRT(%1)
--%ifdef ASM_FORMAT_ELF
-+ %ifdef RT_WITH_NOCRT_ALIASES
-+BEGINPROC_EXPORTED RT_NOCRT(%1)
-+  %ifdef ASM_FORMAT_ELF
- global NAME(%1)
- weak NAME(%1)
- NAME(%1):
--%else
-+  %else
- GLOBALNAME %1
--%endif
--%else  ; !RT_WITH_NOCRT_ALIASES
--BEGINPROC RT_NOCRT(%1)
--%endif ; !RT_WITH_NOCRT_ALIASES
-+  %endif
-+ %else  ; !RT_WITH_NOCRT_ALIASES
-+BEGINPROC_EXPORTED RT_NOCRT(%1)
-+ %endif ; !RT_WITH_NOCRT_ALIASES
- %endmacro ; RT_NOCRT_BEGINPROC
- 
- %ifdef RT_WITH_NOCRT_ALIASES
---- a/src/VBox/Runtime/testcase/tstLdr-4.cpp
-+++ b/src/VBox/Runtime/testcase/tstLdr-4.cpp
-@@ -35,9 +35,9 @@
- #include <iprt/assert.h>
- #include <iprt/param.h>
- #include <iprt/path.h>
--#include <iprt/initterm.h>
- #include <iprt/err.h>
- #include <iprt/string.h>
-+#include <iprt/test.h>
- 
- #include <VBox/sup.h>
- 
-@@ -45,8 +45,9 @@
- /*********************************************************************************************************************************
- *   Global Variables                                                                                                             *
- *********************************************************************************************************************************/
--static SUPGLOBALINFOPAGE g_MyGip = { SUPGLOBALINFOPAGE_MAGIC, SUPGLOBALINFOPAGE_VERSION, SUPGIPMODE_INVARIANT_TSC, 42 };
--static PSUPGLOBALINFOPAGE g_pMyGip = &g_MyGip;
-+static RTTEST               g_hTest;
-+static SUPGLOBALINFOPAGE    g_MyGip = { SUPGLOBALINFOPAGE_MAGIC, SUPGLOBALINFOPAGE_VERSION, SUPGIPMODE_INVARIANT_TSC, 42 };
-+static PSUPGLOBALINFOPAGE   g_pMyGip = &g_MyGip;
- 
- extern "C" DECLEXPORT(int) DisasmTest1(void);
- 
-@@ -58,6 +59,60 @@ static DECLCALLBACK(int) testEnumSegment
-              "     link=%RTptr LB %RTptr align=%RTptr fProt=%#x offFile=%RTfoff\n"
-              , *piSeg, pSeg->RVA, pSeg->cbMapped, pSeg->pszName,
-              pSeg->LinkAddress, pSeg->cb, pSeg->Alignment, pSeg->fProt, pSeg->offFile);
-+
-+    if (pSeg->RVA != NIL_RTLDRADDR)
-+    {
-+        RTTESTI_CHECK(pSeg->cbMapped != NIL_RTLDRADDR);
-+        RTTESTI_CHECK(pSeg->cbMapped >= pSeg->cb);
-+    }
-+    else
-+    {
-+        RTTESTI_CHECK(pSeg->cbMapped == NIL_RTLDRADDR);
-+    }
-+
-+    /*
-+     * Do some address conversion tests:
-+     */
-+    if (pSeg->cbMapped != NIL_RTLDRADDR)
-+    {
-+        /* RTLdrRvaToSegOffset: */
-+        uint32_t    iSegConv   = ~(uint32_t)42;
-+        RTLDRADDR   offSegConv = ~(RTLDRADDR)22;
-+        int rc = RTLdrRvaToSegOffset(hLdrMod, pSeg->RVA, &iSegConv, &offSegConv);
-+        if (RT_FAILURE(rc))
-+            RTTestIFailed("RTLdrRvaToSegOffset failed on Seg #%u / RVA %#RTptr: %Rrc", *piSeg, pSeg->RVA, rc);
-+        else if (iSegConv != *piSeg || offSegConv != 0)
-+                RTTestIFailed("RTLdrRvaToSegOffset on Seg #%u / RVA %#RTptr returned: iSegConv=%#x offSegConv=%RTptr, expected %#x and 0",
-+                              *piSeg, pSeg->RVA, iSegConv, offSegConv, *piSeg);
-+
-+        /* RTLdrSegOffsetToRva: */
-+        RTLDRADDR uRvaConv = ~(RTLDRADDR)22;
-+        rc = RTLdrSegOffsetToRva(hLdrMod, *piSeg, 0, &uRvaConv);
-+        if (RT_FAILURE(rc))
-+            RTTestIFailed("RTLdrSegOffsetToRva failed on Seg #%u / off 0: %Rrc", *piSeg, rc);
-+        else if (uRvaConv != pSeg->RVA)
-+            RTTestIFailed("RTLdrSegOffsetToRva on Seg #%u / off 0 returned: %RTptr, expected %RTptr", *piSeg, uRvaConv, pSeg->RVA);
-+
-+        /* RTLdrLinkAddressToRva: */
-+        uRvaConv = ~(RTLDRADDR)22;
-+        rc = RTLdrLinkAddressToRva(hLdrMod, pSeg->LinkAddress, &uRvaConv);
-+        if (RT_FAILURE(rc))
-+            RTTestIFailed("RTLdrLinkAddressToRva failed on Seg #%u / %RTptr: %Rrc", *piSeg, pSeg->LinkAddress, rc);
-+        else if (uRvaConv != pSeg->RVA)
-+            RTTestIFailed("RTLdrLinkAddressToRva on Seg #%u / %RTptr returned: %RTptr, expected %RTptr",
-+                          *piSeg, pSeg->LinkAddress, uRvaConv, pSeg->RVA);
-+
-+        /* RTLdrLinkAddressToSegOffset: */
-+        iSegConv   = ~(uint32_t)42;
-+        offSegConv = ~(RTLDRADDR)22;
-+        rc = RTLdrLinkAddressToSegOffset(hLdrMod, pSeg->LinkAddress, &iSegConv, &offSegConv);
-+        if (RT_FAILURE(rc))
-+            RTTestIFailed("RTLdrLinkAddressToSegOffset failed on Seg #%u / %#RTptr: %Rrc", *piSeg, pSeg->LinkAddress, rc);
-+        else if (iSegConv != *piSeg || offSegConv != 0)
-+                RTTestIFailed("RTLdrLinkAddressToSegOffset on Seg #%u / %#RTptr returned: iSegConv=%#x offSegConv=%RTptr, expected %#x and 0",
-+                              *piSeg, pSeg->LinkAddress, iSegConv, offSegConv, *piSeg);
-+    }
-+
-     *piSeg += 1;
-     RT_NOREF(hLdrMod);
-     return VINF_SUCCESS;
-@@ -125,12 +180,12 @@ static DECLCALLBACK(int) testGetImport(R
-  * regions the for compare usage. The third is loaded into one
-  * and then relocated between the two and other locations a few times.
-  *
-- * @returns number of errors.
-  * @param   pszFilename     The file to load the mess with.
-  */
--static int testLdrOne(const char *pszFilename)
-+static void testLdrOne(const char *pszFilename)
- {
--    int             cErrors = 0;
-+    RTTestSub(g_hTest, RTPathFilename(pszFilename));
-+
-     size_t          cbImage = 0;
-     struct Load
-     {
-@@ -155,9 +210,8 @@ static int testLdrOne(const char *pszFil
-         rc = RTLdrOpen(pszFilename, 0, RTLDRARCH_WHATEVER, &aLoads[i].hLdrMod);
-         if (RT_FAILURE(rc))
-         {
--            RTPrintf("tstLdr-4: Failed to open '%s'/%d, rc=%Rrc. aborting test.\n", pszFilename, i, rc);
-+            RTTestIFailed("tstLdr-4: Failed to open '%s'/%d, rc=%Rrc. aborting test.", pszFilename, i, rc);
-             Assert(aLoads[i].hLdrMod == NIL_RTLDRMOD);
--            cErrors++;
-             break;
-         }
- 
-@@ -165,8 +219,7 @@ static int testLdrOne(const char *pszFil
-         size_t cb = RTLdrSize(aLoads[i].hLdrMod);
-         if (cbImage && cb != cbImage)
-         {
--            RTPrintf("tstLdr-4: Size mismatch '%s'/%d. aborting test.\n", pszFilename, i);
--            cErrors++;
-+            RTTestIFailed("tstLdr-4: Size mismatch '%s'/%d. aborting test.", pszFilename, i);
-             break;
-         }
-         aLoads[i].cbBits = cbImage = cb;
-@@ -175,8 +228,7 @@ static int testLdrOne(const char *pszFil
-         aLoads[i].pvBits = RTMemExecAlloc(cb);
-         if (!aLoads[i].pvBits)
-         {
--            RTPrintf("tstLdr-4: Out of memory '%s'/%d cbImage=%d. aborting test.\n", pszFilename, i, cbImage);
--            cErrors++;
-+            RTTestIFailed("Out of memory '%s'/%d cbImage=%d. aborting test.", pszFilename, i, cbImage);
-             break;
-         }
- 
-@@ -184,8 +236,7 @@ static int testLdrOne(const char *pszFil
-         rc = RTLdrGetBits(aLoads[i].hLdrMod, aLoads[i].pvBits, (uintptr_t)aLoads[i].pvBits, testGetImport, NULL);
-         if (RT_FAILURE(rc))
-         {
--            RTPrintf("tstLdr-4: Failed to get bits for '%s'/%d, rc=%Rrc. aborting test\n", pszFilename, i, rc);
--            cErrors++;
-+            RTTestIFailed("Failed to get bits for '%s'/%d, rc=%Rrc. aborting test", pszFilename, i, rc);
-             break;
-         }
-     }
-@@ -193,7 +244,7 @@ static int testLdrOne(const char *pszFil
-     /*
-      * Execute the code.
-      */
--    if (!cErrors)
-+    if (!RTTestSubErrorCount(g_hTest))
-     {
-         for (i = 0; i < RT_ELEMENTS(aLoads); i += 1)
-         {
-@@ -209,22 +260,18 @@ static int testLdrOne(const char *pszFil
-                                       UINT32_MAX, "_DisasmTest1", &Value);
-             if (RT_FAILURE(rc))
-             {
--                RTPrintf("tstLdr-4: Failed to get symbol \"DisasmTest1\" from load #%d: %Rrc\n", i, rc);
--                cErrors++;
-+                RTTestIFailed("Failed to get symbol \"DisasmTest1\" from load #%d: %Rrc", i, rc);
-                 break;
-             }
-             DECLCALLBACKPTR(int, pfnDisasmTest1)(void) = (DECLCALLBACKPTR(int, RT_NOTHING)(void))(uintptr_t)Value; /* eeeh. */
--            RTPrintf("tstLdr-4: pfnDisasmTest1=%p / add-symbol-file %s %#x\n", pfnDisasmTest1, pszFilename, aLoads[i].pvBits);
-+            RTPrintf("tstLdr-4: pfnDisasmTest1=%p / add-symbol-file %s %#p\n", pfnDisasmTest1, pszFilename, aLoads[i].pvBits);
-             uint32_t iSeg = 0;
-             RTLdrEnumSegments(aLoads[i].hLdrMod, testEnumSegment, &iSeg);
- 
-             /* call the test function. */
-             rc = pfnDisasmTest1();
-             if (rc)
--            {
--                RTPrintf("tstLdr-4: load #%d Test1 -> %#x\n", i, rc);
--                cErrors++;
--            }
-+                RTTestIFailed("load #%d Test1 -> %#x", i, rc);
- 
-             /* While we're here, check a couple of RTLdrQueryProp calls too */
-             void *pvBits = aLoads[i].pvBits;
-@@ -255,56 +302,42 @@ static int testLdrOne(const char *pszFil
-         {
-             rc = RTLdrClose(aLoads[i].hLdrMod);
-             if (RT_FAILURE(rc))
--            {
--                RTPrintf("tstLdr-4: Failed to close '%s' i=%d, rc=%Rrc.\n", pszFilename, i, rc);
--                cErrors++;
--            }
-+                RTTestIFailed("Failed to close '%s' i=%d, rc=%Rrc.", pszFilename, i, rc);
-         }
-     }
- 
--    return cErrors;
- }
- 
- 
- 
--int main(int argc, char **argv)
-+int main()
- {
--    int cErrors = 0;
--    RTR3InitExe(argc, &argv, 0);
-+    RTEXITCODE rcExit = RTTestInitAndCreate("tstLdr-4", &g_hTest);
-+    if (rcExit != RTEXITCODE_SUCCESS)
-+        return rcExit;
- 
-     /*
-      * Sanity check.
-      */
-     int rc = DisasmTest1();
--    if (rc)
-+    if (rc == 0)
-     {
--        RTPrintf("tstLdr-4: FATAL ERROR - DisasmTest1 is buggy: rc=%#x\n", rc);
--        return 1;
--    }
-+        /*
-+         * Execute the test.
-+         */
-+        char szPath[RTPATH_MAX];
-+        rc = RTPathExecDir(szPath, sizeof(szPath) - sizeof("/tstLdrObjR0.r0"));
-+        if (RT_SUCCESS(rc))
-+        {
-+            strcat(szPath, "/tstLdrObjR0.r0");
- 
--    /*
--     * Execute the test.
--     */
--    char szPath[RTPATH_MAX];
--    rc = RTPathExecDir(szPath, sizeof(szPath) - sizeof("/tstLdrObjR0.r0"));
--    if (RT_SUCCESS(rc))
--    {
--        strcat(szPath, "/tstLdrObjR0.r0");
--        RTPrintf("tstLdr-4: TESTING '%s'...\n", szPath);
--        cErrors += testLdrOne(szPath);
-+            testLdrOne(szPath);
-+        }
-+        else
-+            RTTestIFailed("RTPathExecDir -> %Rrc", rc);
-     }
-     else
--    {
--        RTPrintf("tstLdr-4: RTPathExecDir -> %Rrc\n", rc);
--        cErrors++;
--    }
-+        RTTestIFailed("FATAL ERROR - DisasmTest1 is buggy: rc=%#x", rc);
- 
--    /*
--     * Test result summary.
--     */
--    if (!cErrors)
--        RTPrintf("tstLdr-4: SUCCESS\n");
--    else
--        RTPrintf("tstLdr-4: FAILURE - %d errors\n", cErrors);
--    return !!cErrors;
-+    return RTTestSummaryAndDestroy(g_hTest);
- }
---- a/include/iprt/formats/elf-common.h
-+++ b/include/iprt/formats/elf-common.h
-@@ -198,6 +198,12 @@ typedef struct {
- #define PT_LOPROC       0x70000000      /* First processor-specific type. */
- #define PT_HIPROC       0x7fffffff      /* Last processor-specific type. */
- 
-+#define PT_GNU_EH_FRAME 0x6474e550 /**< GNU/Linux -> .eh_frame_hdr */
-+#define PT_GNU_STACK    0x6474e551 /**< GNU/Linux -> stack prot (RWX or RW) */
-+#define PT_GNU_RELRO    0x6474e552 /**< GNU/Linux -> make RO after relocations */
-+#define PT_GNU_PROPERTY 0x6474e553 /**< GNU/Linux -> .note.gnu.property */
-+
-+
- /* Values for p_flags. */
- #define PF_X            0x1     /* Executable. */
- #define PF_W            0x2     /* Writable. */
---- a/src/VBox/Runtime/common/ldr/ldrELF.cpp
-+++ b/src/VBox/Runtime/common/ldr/ldrELF.cpp
-@@ -51,9 +51,11 @@
- *   Defined Constants And Macros                                                                                                 *
- *********************************************************************************************************************************/
- /** Finds an ELF symbol table string. */
--#define ELF_STR(pHdrs, iStr) ((pHdrs)->pStr + (iStr))
-+#define ELF_STR(pHdrs, iStr)        ((pHdrs)->Rel.pStr + (iStr))
-+/** Finds an ELF symbol table string. */
-+#define ELF_DYN_STR(pHdrs, iStr)    ((pHdrs)->Dyn.pStr + (iStr))
- /** Finds an ELF section header string. */
--#define ELF_SH_STR(pHdrs, iStr) ((pHdrs)->pShStr + (iStr))
-+#define ELF_SH_STR(pHdrs, iStr)     ((pHdrs)->pShStr + (iStr))
- 
- 
- 
-@@ -62,6 +64,7 @@
- *********************************************************************************************************************************/
- #ifdef LOG_ENABLED
- static const char *rtldrElfGetShdrType(uint32_t iType);
-+static const char *rtldrElfGetPhdrType(uint32_t iType);
- #endif
- 
- 
-@@ -81,6 +84,7 @@ static const char *rtldrElfGetShdrType(u
- 
- 
- #ifdef LOG_ENABLED
-+
- /**
-  * Gets the section type.
-  *
-@@ -91,23 +95,51 @@ static const char *rtldrElfGetShdrType(u
- {
-     switch (iType)
-     {
--        case SHT_NULL:          return "SHT_NULL";
--        case SHT_PROGBITS:      return "SHT_PROGBITS";
--        case SHT_SYMTAB:        return "SHT_SYMTAB";
--        case SHT_STRTAB:        return "SHT_STRTAB";
--        case SHT_RELA:          return "SHT_RELA";
--        case SHT_HASH:          return "SHT_HASH";
--        case SHT_DYNAMIC:       return "SHT_DYNAMIC";
--        case SHT_NOTE:          return "SHT_NOTE";
--        case SHT_NOBITS:        return "SHT_NOBITS";
--        case SHT_REL:           return "SHT_REL";
--        case SHT_SHLIB:         return "SHT_SHLIB";
--        case SHT_DYNSYM:        return "SHT_DYNSYM";
-+        RT_CASE_RET_STR(SHT_NULL);
-+        RT_CASE_RET_STR(SHT_PROGBITS);
-+        RT_CASE_RET_STR(SHT_SYMTAB);
-+        RT_CASE_RET_STR(SHT_STRTAB);
-+        RT_CASE_RET_STR(SHT_RELA);
-+        RT_CASE_RET_STR(SHT_HASH);
-+        RT_CASE_RET_STR(SHT_DYNAMIC);
-+        RT_CASE_RET_STR(SHT_NOTE);
-+        RT_CASE_RET_STR(SHT_NOBITS);
-+        RT_CASE_RET_STR(SHT_REL);
-+        RT_CASE_RET_STR(SHT_SHLIB);
-+        RT_CASE_RET_STR(SHT_DYNSYM);
-         default:
-             return "";
-     }
- }
--#endif
-+
-+/**
-+ * Gets the program header type.
-+ *
-+ * @returns Pointer to read only string.
-+ * @param   iType       The section type index.
-+ */
-+static const char *rtldrElfGetPhdrType(uint32_t iType)
-+{
-+    switch (iType)
-+    {
-+        RT_CASE_RET_STR(PT_NULL);
-+        RT_CASE_RET_STR(PT_LOAD);
-+        RT_CASE_RET_STR(PT_DYNAMIC);
-+        RT_CASE_RET_STR(PT_INTERP);
-+        RT_CASE_RET_STR(PT_NOTE);
-+        RT_CASE_RET_STR(PT_SHLIB);
-+        RT_CASE_RET_STR(PT_PHDR);
-+        RT_CASE_RET_STR(PT_TLS);
-+        RT_CASE_RET_STR(PT_GNU_EH_FRAME);
-+        RT_CASE_RET_STR(PT_GNU_STACK);
-+        RT_CASE_RET_STR(PT_GNU_RELRO);
-+        RT_CASE_RET_STR(PT_GNU_PROPERTY);
-+        default:
-+            return "";
-+    }
-+}
-+
-+#endif /* LOG_ENABLED*/
- 
- 
- /**
-@@ -124,8 +156,6 @@ DECLHIDDEN(int) rtldrELFOpen(PRTLDRREADE
- {
-     const char *pszLogName = pReader->pfnLogName(pReader); NOREF(pszLogName);
- 
--    RT_NOREF_PV(pErrInfo); /** @todo implement */
--
-     /*
-      * Read the ident to decide if this is 32-bit or 64-bit
-      * and worth dealing with.
-@@ -134,6 +164,7 @@ DECLHIDDEN(int) rtldrELFOpen(PRTLDRREADE
-     int rc = pReader->pfnRead(pReader, &e_ident, sizeof(e_ident), 0);
-     if (RT_FAILURE(rc))
-         return rc;
-+
-     if (    e_ident[EI_MAG0] != ELFMAG0
-         ||  e_ident[EI_MAG1] != ELFMAG1
-         ||  e_ident[EI_MAG2] != ELFMAG2
-@@ -141,19 +172,17 @@ DECLHIDDEN(int) rtldrELFOpen(PRTLDRREADE
-         ||  (   e_ident[EI_CLASS] != ELFCLASS32
-              && e_ident[EI_CLASS] != ELFCLASS64)
-        )
--    {
--        Log(("RTLdrELF: %s: Unsupported/invalid ident %.*Rhxs\n", pszLogName, sizeof(e_ident), e_ident));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Unsupported/invalid ident %.*Rhxs", pszLogName, sizeof(e_ident), e_ident);
-+
-     if (e_ident[EI_DATA] != ELFDATA2LSB)
--    {
--        Log(("RTLdrELF: %s: ELF endian %x is unsupported\n", pszLogName, e_ident[EI_DATA]));
--        return VERR_LDRELF_ODD_ENDIAN;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_ODD_ENDIAN,
-+                                   "%s: ELF endian %x is unsupported", pszLogName, e_ident[EI_DATA]);
-+
-     if (e_ident[EI_CLASS] == ELFCLASS32)
--        rc = rtldrELF32Open(pReader, fFlags, enmArch, phLdrMod);
-+        rc = rtldrELF32Open(pReader, fFlags, enmArch, phLdrMod, pErrInfo);
-     else
--        rc = rtldrELF64Open(pReader, fFlags, enmArch, phLdrMod);
-+        rc = rtldrELF64Open(pReader, fFlags, enmArch, phLdrMod, pErrInfo);
-     return rc;
- }
- 
---- a/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
-+++ b/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
-@@ -29,31 +29,37 @@
- *   Defined Constants And Macros                                               *
- *******************************************************************************/
- #if ELF_MODE == 32
--#define RTLDRELF_NAME(name) rtldrELF32##name
--#define RTLDRELF_SUFF(name) name##32
--#define RTLDRELF_MID(pre,suff) pre##32##suff
--#define FMT_ELF_ADDR    "%08RX32"
--#define FMT_ELF_HALF    "%04RX16"
--#define FMT_ELF_OFF     "%08RX32"
--#define FMT_ELF_SIZE    "%08RX32"
--#define FMT_ELF_SWORD   "%RI32"
--#define FMT_ELF_WORD    "%08RX32"
--#define FMT_ELF_XWORD   "%08RX32"
--#define FMT_ELF_SXWORD  "%RI32"
-+# define RTLDRELF_NAME(name)    rtldrELF32##name
-+# define RTLDRELF_SUFF(name)    name##32
-+# define RTLDRELF_MID(pre,suff) pre##32##suff
-+# define FMT_ELF_ADDR           "%08RX32"
-+# define FMT_ELF_ADDR7          "%07RX32"
-+# define FMT_ELF_HALF           "%04RX16"
-+# define FMT_ELF_OFF            "%08RX32"
-+# define FMT_ELF_SIZE           "%08RX32"
-+# define FMT_ELF_SWORD          "%RI32"
-+# define FMT_ELF_WORD           "%08RX32"
-+# define FMT_ELF_XWORD          "%08RX32"
-+# define FMT_ELF_SXWORD         "%RI32"
-+# define Elf_Xword              Elf32_Word
-+# define Elf_Sxword             Elf32_Sword
- 
- #elif ELF_MODE == 64
--#define RTLDRELF_NAME(name) rtldrELF64##name
--#define RTLDRELF_SUFF(name) name##64
--#define RTLDRELF_MID(pre,suff) pre##64##suff
--#define FMT_ELF_ADDR    "%016RX64"
--#define FMT_ELF_HALF    "%04RX16"
--#define FMT_ELF_SHALF   "%RI16"
--#define FMT_ELF_OFF     "%016RX64"
--#define FMT_ELF_SIZE    "%016RX64"
--#define FMT_ELF_SWORD   "%RI32"
--#define FMT_ELF_WORD    "%08RX32"
--#define FMT_ELF_XWORD   "%016RX64"
--#define FMT_ELF_SXWORD  "%RI64"
-+# define RTLDRELF_NAME(name)    rtldrELF64##name
-+# define RTLDRELF_SUFF(name)    name##64
-+# define RTLDRELF_MID(pre,suff) pre##64##suff
-+# define FMT_ELF_ADDR           "%016RX64"
-+# define FMT_ELF_ADDR7          "%08RX64"
-+# define FMT_ELF_HALF           "%04RX16"
-+# define FMT_ELF_SHALF          "%RI16"
-+# define FMT_ELF_OFF            "%016RX64"
-+# define FMT_ELF_SIZE           "%016RX64"
-+# define FMT_ELF_SWORD          "%RI32"
-+# define FMT_ELF_WORD           "%08RX32"
-+# define FMT_ELF_XWORD          "%016RX64"
-+# define FMT_ELF_SXWORD         "%RI64"
-+# define Elf_Xword              Elf64_Xword
-+# define Elf_Sxword             Elf64_Sxword
- #endif
- 
- #define Elf_Ehdr            RTLDRELF_MID(Elf,_Ehdr)
-@@ -74,6 +80,9 @@
- #define RTLDRMODELF         RTLDRELF_MID(RTLDRMODELF,RT_NOTHING)
- #define PRTLDRMODELF        RTLDRELF_MID(PRTLDRMODELF,RT_NOTHING)
- 
-+#define RTLDRMODELFSHX      RTLDRELF_MID(RTLDRMODELFSHX,RT_NOTHING)
-+#define PRTLDRMODELFSHX     RTLDRELF_MID(PRTLDRMODELFSHX,RT_NOTHING)
-+
- #define ELF_R_SYM(info)     RTLDRELF_MID(ELF,_R_SYM)(info)
- #define ELF_R_TYPE(info)    RTLDRELF_MID(ELF,_R_TYPE)(info)
- #define ELF_R_INFO(sym, type) RTLDRELF_MID(ELF,_R_INFO)(sym, type)
-@@ -86,6 +95,20 @@
- *   Structures and Typedefs                                                    *
- *******************************************************************************/
- /**
-+ * Extra section info.
-+ */
-+typedef struct RTLDRMODELFSHX
-+{
-+    /** The corresponding program header. */
-+    uint16_t        idxPhdr;
-+    /** The corresponding dynamic section entry (address). */
-+    uint16_t        idxDt;
-+    /** The DT tag. */
-+    uint32_t        uDtTag;
-+} RTLDRMODELFSHX;
-+typedef RTLDRMODELFSHX *PRTLDRMODELFSHX;
-+
-+/**
-  * The ELF loader structure.
-  */
- typedef struct RTLDRMODELF
-@@ -105,36 +128,82 @@ typedef struct RTLDRMODELF
-     /** Unmodified section headers (allocated after paShdrs, so no need to free).
-      * Not valid if the image is DONE. */
-     Elf_Shdr const         *paOrgShdrs;
-+    /** Runs parallel to paShdrs and is part of the same allocation. */
-+    PRTLDRMODELFSHX         paShdrExtras;
-+    /** Base section number, either 1 or zero depending on whether we've
-+     *  re-used the NULL entry for .elf.headers in ET_EXEC/ET_DYN. */
-+    unsigned                iFirstSect;
-+    /** Set if the SHF_ALLOC section headers are in order of sh_addr. */
-+    bool                    fShdrInOrder;
-     /** The size of the loaded image. */
-     size_t                  cbImage;
- 
-     /** The image base address if it's an EXEC or DYN image. */
-     Elf_Addr                LinkAddress;
- 
--    /** The symbol section index. */
--    unsigned                iSymSh;
--    /** Number of symbols in the table. */
--    unsigned                cSyms;
--    /** Pointer to symbol table within RTLDRMODELF::pvBits. */
--    const Elf_Sym          *paSyms;
--
--    /** The string section index. */
--    unsigned                iStrSh;
--    /** Size of the string table. */
--    unsigned                cbStr;
--    /** Pointer to string table within RTLDRMODELF::pvBits. */
--    const char             *pStr;
-+    struct
-+    {
-+        /** The symbol section index. */
-+        unsigned            iSymSh;
-+        /** Number of symbols in the table. */
-+        unsigned            cSyms;
-+        /** Pointer to symbol table within RTLDRMODELF::pvBits. */
-+        const Elf_Sym      *paSyms;
-+
-+        /** The string section index. */
-+        unsigned            iStrSh;
-+        /** Size of the string table. */
-+        unsigned            cbStr;
-+        /** Pointer to string table within RTLDRMODELF::pvBits. */
-+        const char         *pStr;
-+    } Rel /**< Regular symbols and strings. */
-+    , Dyn /**< Dynamic symbols and strings. */;
- 
--    /** Size of the section header string table. */
--    unsigned                cbShStr;
-     /** Pointer to section header string table within RTLDRMODELF::pvBits. */
-     const char             *pShStr;
-+    /** Size of the section header string table. */
-+    unsigned                cbShStr;
- 
-     /** The '.eh_frame' section index.  Zero if not searched for, ~0U if not found. */
-     unsigned                iShEhFrame;
-     /** The '.eh_frame_hdr' section index.  Zero if not searched for, ~0U if not found. */
-     unsigned                iShEhFrameHdr;
--} RTLDRMODELF, *PRTLDRMODELF;
-+
-+    /** The '.dynamic' / SHT_DYNAMIC section index.  ~0U if not present. */
-+    unsigned                iShDynamic;
-+    /** Number of entries in paDynamic. */
-+    unsigned                cDynamic;
-+    /** The dynamic section (NULL for ET_REL). */
-+    Elf_Dyn                *paDynamic;
-+    /** Program headers (NULL for ET_REL). */
-+    Elf_Phdr               *paPhdrs;
-+
-+    /** Info extracted from PT_DYNAMIC and the program headers. */
-+    struct
-+    {
-+        /** DT_RELA/DT_REL. */
-+        Elf_Addr            uPtrRelocs;
-+        /** DT_RELASZ/DT_RELSZ. */
-+        Elf_Xword           cbRelocs;
-+        /** Non-zero if we've seen DT_RELAENT/DT_RELENT. */
-+        unsigned            cbRelocEntry;
-+        /** DT_RELA or DT_REL. */
-+        unsigned            uRelocType;
-+        /** The index of the section header matching DT_RELA/DT_REL. */
-+        unsigned            idxShRelocs;
-+
-+        /** DT_JMPREL. */
-+        Elf_Addr            uPtrJmpRelocs;
-+        /** DT_PLTRELSZ. */
-+        Elf_Xword           cbJmpRelocs;
-+        /** DT_RELA or DT_REL (if we've seen DT_PLTREL). */
-+        unsigned            uJmpRelocType;
-+        /** The index of the section header matching DT_JMPREL. */
-+        unsigned            idxShJmpRelocs;
-+    } DynInfo;
-+} RTLDRMODELF;
-+/** Pointer to an ELF module instance. */
-+typedef RTLDRMODELF *PRTLDRMODELF;
- 
- 
- /**
-@@ -154,11 +223,15 @@ static int RTLDRELF_NAME(MapBits)(PRTLDR
-     if (RT_SUCCESS(rc))
-     {
-         const uint8_t *pu8 = (const uint8_t *)pModElf->pvBits;
--        if (pModElf->iSymSh != ~0U)
--            pModElf->paSyms = (const Elf_Sym *)(pu8 + pModElf->paShdrs[pModElf->iSymSh].sh_offset);
--        if (pModElf->iStrSh != ~0U)
--            pModElf->pStr   =    (const char *)(pu8 + pModElf->paShdrs[pModElf->iStrSh].sh_offset);
--        pModElf->pShStr     =    (const char *)(pu8 + pModElf->paShdrs[pModElf->Ehdr.e_shstrndx].sh_offset);
-+        if (pModElf->Rel.iSymSh != ~0U)
-+            pModElf->Rel.paSyms = (const Elf_Sym *)(pu8 + pModElf->paShdrs[pModElf->Rel.iSymSh].sh_offset);
-+        if (pModElf->Rel.iStrSh != ~0U)
-+            pModElf->Rel.pStr   =    (const char *)(pu8 + pModElf->paShdrs[pModElf->Rel.iStrSh].sh_offset);
-+        if (pModElf->Dyn.iSymSh != ~0U)
-+            pModElf->Dyn.paSyms = (const Elf_Sym *)(pu8 + pModElf->paShdrs[pModElf->Dyn.iSymSh].sh_offset);
-+        if (pModElf->Dyn.iStrSh != ~0U)
-+            pModElf->Dyn.pStr   =    (const char *)(pu8 + pModElf->paShdrs[pModElf->Dyn.iStrSh].sh_offset);
-+        pModElf->pShStr         =    (const char *)(pu8 + pModElf->paShdrs[pModElf->Ehdr.e_shstrndx].sh_offset);
- 
-         /*
-          * Verify that the ends of the string tables have a zero terminator
-@@ -167,8 +240,12 @@ static int RTLDRELF_NAME(MapBits)(PRTLDR
-          * sh_offset and sh_size were verfied in RTLDRELF_NAME(ValidateSectionHeader)() already so they
-          * are safe to use.
-          */
--        AssertMsgStmt(   pModElf->iStrSh == ~0U
--                      || pModElf->pStr[pModElf->paShdrs[pModElf->iStrSh].sh_size - 1] == '\0',
-+        AssertMsgStmt(   pModElf->Rel.iStrSh == ~0U
-+                      || pModElf->Rel.pStr[pModElf->paShdrs[pModElf->Rel.iStrSh].sh_size - 1] == '\0',
-+                      ("The string table is not zero terminated!\n"),
-+                      rc = VERR_LDRELF_UNTERMINATED_STRING_TAB);
-+        AssertMsgStmt(   pModElf->Dyn.iStrSh == ~0U
-+                      || pModElf->Dyn.pStr[pModElf->paShdrs[pModElf->Dyn.iStrSh].sh_size - 1] == '\0',
-                       ("The string table is not zero terminated!\n"),
-                       rc = VERR_LDRELF_UNTERMINATED_STRING_TAB);
-         AssertMsgStmt(pModElf->pShStr[pModElf->paShdrs[pModElf->Ehdr.e_shstrndx].sh_size - 1] == '\0',
-@@ -180,10 +257,12 @@ static int RTLDRELF_NAME(MapBits)(PRTLDR
-             /* Unmap. */
-             int rc2 = pModElf->Core.pReader->pfnUnmap(pModElf->Core.pReader, pModElf->pvBits);
-             AssertRC(rc2);
--            pModElf->pvBits = NULL;
--            pModElf->paSyms = NULL;
--            pModElf->pStr   = NULL;
--            pModElf->pShStr = NULL;
-+            pModElf->pvBits     = NULL;
-+            pModElf->Rel.paSyms = NULL;
-+            pModElf->Rel.pStr   = NULL;
-+            pModElf->Dyn.paSyms = NULL;
-+            pModElf->Dyn.pStr   = NULL;
-+            pModElf->pShStr     = NULL;
-         }
-     }
-     return rc;
-@@ -200,6 +279,101 @@ static int RTLDRELF_NAME(MapBits)(PRTLDR
-  *
-  */
- 
-+/**
-+ * Get the symbol and symbol value.
-+ *
-+ * @returns iprt status code.
-+ * @param   pModElf         The ELF loader module instance data.
-+ * @param   BaseAddr        The base address which the module is being fixedup to.
-+ * @param   pfnGetImport    The callback function to use to resolve imports (aka unresolved externals).
-+ * @param   pvUser          User argument to pass to the callback.
-+ * @param   iSym            The symbol to get.
-+ * @param   ppSym           Where to store the symbol pointer on success. (read only)
-+ * @param   pSymValue       Where to store the symbol value on success.
-+ */
-+static int RTLDRELF_NAME(SymbolExecDyn)(PRTLDRMODELF pModElf, Elf_Addr BaseAddr, PFNRTLDRIMPORT pfnGetImport, void *pvUser,
-+                                        Elf_Size iSym, const Elf_Sym **ppSym, Elf_Addr *pSymValue)
-+{
-+    /*
-+     * Validate and find the symbol.
-+     */
-+    AssertMsgReturn(iSym < pModElf->Dyn.cSyms, ("iSym=%d is an invalid symbol index!\n", iSym), VERR_LDRELF_INVALID_SYMBOL_INDEX);
-+    const Elf_Sym *pSym = &pModElf->Dyn.paSyms[iSym];
-+    *ppSym = pSym;
-+
-+    AssertMsgReturn(pSym->st_name < pModElf->Dyn.cbStr,
-+                    ("iSym=%d st_name=%d str sh_size=%d\n", iSym, pSym->st_name, pModElf->Dyn.cbStr),
-+                    VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET);
-+    const char * const pszName = pModElf->Dyn.pStr + pSym->st_name;
-+
-+    /*
-+     * Determine the symbol value.
-+     *
-+     * Symbols needs different treatment depending on which section their are in.
-+     * Undefined and absolute symbols goes into special non-existing sections.
-+     */
-+    switch (pSym->st_shndx)
-+    {
-+        /*
-+         * Undefined symbol, needs resolving.
-+         *
-+         * Since ELF has no generic concept of importing from specific module (the OS/2 ELF format
-+         * has but that's an OS extension and only applies to programs and dlls), we'll have to ask
-+         * the resolver callback to do a global search.
-+         */
-+        case SHN_UNDEF:
-+        {
-+            /* Try to resolve the symbol. */
-+            RTUINTPTR Value;
-+            int rc = pfnGetImport(&pModElf->Core, "", pszName, ~0U, &Value, pvUser);
-+            AssertMsgRCReturn(rc, ("Failed to resolve '%s' (iSym=" FMT_ELF_SIZE " rc=%Rrc\n", pszName, iSym, rc), rc);
-+
-+            *pSymValue = (Elf_Addr)Value;
-+            AssertMsgReturn((RTUINTPTR)*pSymValue == Value,
-+                            ("Symbol value overflowed! '%s' (iSym=" FMT_ELF_SIZE "\n", pszName, iSym), VERR_SYMBOL_VALUE_TOO_BIG);
-+
-+            Log2(("rtldrELF: #%-3d - UNDEF " FMT_ELF_ADDR " '%s'\n", iSym, *pSymValue, pszName));
-+            break;
-+        }
-+
-+        /*
-+         * Absolute symbols needs no fixing since they are, well, absolute.
-+         */
-+        case SHN_ABS:
-+            *pSymValue = pSym->st_value;
-+            Log2(("rtldrELF: #%-3d - ABS   " FMT_ELF_ADDR " '%s'\n", iSym, *pSymValue, pszName));
-+            break;
-+
-+        /*
-+         * All other symbols are addressed relative the image base in DYN and EXEC binaries.
-+         */
-+        default:
-+            AssertMsgReturn(pSym->st_shndx < pModElf->Ehdr.e_shnum,
-+                            ("iSym=%d st_shndx=%d e_shnum=%d pszName=%s\n", iSym, pSym->st_shndx, pModElf->Ehdr.e_shnum, pszName),
-+                            VERR_BAD_EXE_FORMAT);
-+            *pSymValue = pSym->st_value + BaseAddr;
-+            Log2(("rtldrELF: #%-3d - %5d " FMT_ELF_ADDR " '%s'\n", iSym, pSym->st_shndx, *pSymValue, pszName));
-+            break;
-+    }
-+
-+    return VINF_SUCCESS;
-+}
-+
-+
-+#if   ELF_MODE == 32
-+/** Helper for RelocateSectionExecDyn. */
-+DECLINLINE(const Elf_Shdr *) RTLDRELF_NAME(RvaToSectionHeader)(PRTLDRMODELF pModElf, Elf_Addr uRva)
-+{
-+    const Elf_Shdr * const pShdrFirst = pModElf->paShdrs;
-+    const Elf_Shdr *pShdr = pShdrFirst + pModElf->Ehdr.e_shnum;
-+    while (--pShdr != pShdrFirst)
-+        if (uRva - pShdr->sh_addr /*rva*/ < pShdr->sh_size)
-+            return pShdr;
-+    AssertFailed();
-+    return pShdr;
-+}
-+#endif
-+
- 
- /**
-  * Applies the fixups for a section in an executable image.
-@@ -230,84 +404,106 @@ static int RTLDRELF_NAME(RelocateSection
-      * Iterate the relocations.
-      * The relocations are stored in an array of Elf32_Rel records and covers the entire relocation section.
-      */
-+#if   ELF_MODE == 32
-+    const Elf_Shdr   *pShdr    = pModElf->paShdrs;
-     const Elf_Addr    offDelta = BaseAddr - pModElf->LinkAddress;
-+#endif
-     const Elf_Reloc  *paRels   = (const Elf_Reloc *)pvRelocs;
--    const unsigned    iRelMax   = (unsigned)(cbRelocs / sizeof(paRels[0]));
-+    const unsigned    iRelMax  = (unsigned)(cbRelocs / sizeof(paRels[0]));
-     AssertMsgReturn(iRelMax == cbRelocs / sizeof(paRels[0]), (FMT_ELF_SIZE "\n", cbRelocs / sizeof(paRels[0])),
-                     VERR_IMAGE_TOO_BIG);
-     for (unsigned iRel = 0; iRel < iRelMax; iRel++)
-     {
-         /*
--         * Skip R_XXX_NONE entries early to avoid confusion in the symbol
--         * getter code.
-+         * Apply fixups not taking a symbol (will 'continue' rather than 'break').
-          */
-+        AssertMsgReturn(paRels[iRel].r_offset < cbSec, (FMT_ELF_ADDR " " FMT_ELF_SIZE "\n", paRels[iRel].r_offset, cbSec),
-+                        VERR_LDRELF_INVALID_RELOCATION_OFFSET);
- #if   ELF_MODE == 32
--        if (ELF_R_TYPE(paRels[iRel].r_info) == R_386_NONE)
--            continue;
--#elif ELF_MODE == 64
--        if (ELF_R_TYPE(paRels[iRel].r_info) == R_X86_64_NONE)
--            continue;
-+        if (paRels[iRel].r_offset - pShdr->sh_addr /*rva*/ >= pShdr->sh_size)
-+            pShdr = RTLDRELF_NAME(RvaToSectionHeader)(pModElf, paRels[iRel].r_offset);
-+        static const Elf_Addr s_uZero = 0;
-+        const Elf_Addr *pAddrR = RT_LIKELY(pShdr->sh_type != SHT_NOBITS)                     /* Where to read the addend. */
-+                               ? (const Elf_Addr *)(pu8SecBaseR + paRels[iRel].r_offset - pShdr->sh_addr /*rva*/
-+                                                    + pShdr->sh_offset)
-+                               : &s_uZero;
- #endif
--
--        /*
--         * Validate and find the symbol, resolve undefined ones.
--         */
--        Elf_Size iSym = ELF_R_SYM(paRels[iRel].r_info);
--        if (iSym >= pModElf->cSyms)
--        {
--            AssertMsgFailed(("iSym=%d is an invalid symbol index!\n", iSym));
--            return VERR_LDRELF_INVALID_SYMBOL_INDEX;
--        }
--        const Elf_Sym *pSym = &pModElf->paSyms[iSym];
--        if (pSym->st_name >= pModElf->cbStr)
-+        Elf_Addr       *pAddrW =       (Elf_Addr *)(pu8SecBaseW + paRels[iRel].r_offset);    /* Where to write the fixup. */
-+        switch (ELF_R_TYPE(paRels[iRel].r_info))
-         {
--            AssertMsgFailed(("iSym=%d st_name=%d str sh_size=%d\n", iSym, pSym->st_name, pModElf->cbStr));
--            return VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET;
--        }
-+            /*
-+             * Image relative (addend + base).
-+             */
-+#if   ELF_MODE == 32
-+            case R_386_RELATIVE:
-+            {
-+                const Elf_Addr Value = *pAddrR + BaseAddr;
-+                *(uint32_t *)pAddrW = Value;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_386_RELATIVE Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value));
-+                AssertCompile(sizeof(Value) == sizeof(uint32_t));
-+                continue;
-+            }
-+#elif ELF_MODE == 64
-+            case R_X86_64_RELATIVE:
-+            {
-+                const Elf_Addr Value = paRels[iRel].r_addend + BaseAddr;
-+                *(uint64_t *)pAddrW = (uint64_t)Value;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_RELATIVE Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value));
-+                AssertCompile(sizeof(Value) == sizeof(uint64_t));
-+                continue;
-+            }
-+#endif
- 
--        Elf_Addr SymValue = 0;
--        if (pSym->st_shndx == SHN_UNDEF)
--        {
--            /* Try to resolve the symbol. */
--            const char *pszName = ELF_STR(pModElf, pSym->st_name);
--            RTUINTPTR   ExtValue;
--            int rc = pfnGetImport(&pModElf->Core, "", pszName, ~0U, &ExtValue, pvUser);
--            AssertMsgRCReturn(rc, ("Failed to resolve '%s' rc=%Rrc\n", pszName, rc), rc);
--            SymValue = (Elf_Addr)ExtValue;
--            AssertMsgReturn((RTUINTPTR)SymValue == ExtValue, ("Symbol value overflowed! '%s'\n", pszName),
--                            VERR_SYMBOL_VALUE_TOO_BIG);
--            Log2(("rtldrELF: #%-3d - UNDEF " FMT_ELF_ADDR " '%s'\n", iSym, SymValue, pszName));
--        }
--        else
--        {
--            AssertMsgReturn(pSym->st_shndx < pModElf->Ehdr.e_shnum || pSym->st_shndx == SHN_ABS, ("%#x\n", pSym->st_shndx),
--                            VERR_LDRELF_INVALID_RELOCATION_OFFSET);
--#if   ELF_MODE == 64
--            SymValue = pSym->st_value;
-+            /*
-+             * R_XXX_NONE.
-+             */
-+#if   ELF_MODE == 32
-+            case R_386_NONE:
-+#elif ELF_MODE == 64
-+            case R_X86_64_NONE:
- #endif
-+                continue;
-         }
- 
--#if   ELF_MODE == 64
--        /* Calc the value (indexes checked above; assumes SHN_UNDEF == 0). */
--        Elf_Addr Value;
--        if (pSym->st_shndx < pModElf->Ehdr.e_shnum)
--            Value = SymValue + offDelta;
--        else /* SHN_ABS: */
--            Value = SymValue + paRels[iRel].r_addend;
--#endif
-+        /*
-+         * Validate and find the symbol, resolve undefined ones.
-+         */
-+        const Elf_Sym  *pSym = NULL; /* shut up gcc */
-+        Elf_Addr        SymValue = 0; /* shut up gcc-4 */
-+        int rc = RTLDRELF_NAME(SymbolExecDyn)(pModElf, BaseAddr, pfnGetImport, pvUser, ELF_R_SYM(paRels[iRel].r_info), &pSym, &SymValue);
-+        if (RT_FAILURE(rc))
-+            return rc;
- 
-         /*
-          * Apply the fixup.
-          */
--        AssertMsgReturn(paRels[iRel].r_offset < cbSec, (FMT_ELF_ADDR " " FMT_ELF_SIZE "\n", paRels[iRel].r_offset, cbSec), VERR_LDRELF_INVALID_RELOCATION_OFFSET);
--#if   ELF_MODE == 32
--        const Elf_Addr *pAddrR = (const Elf_Addr *)(pu8SecBaseR + paRels[iRel].r_offset);    /* Where to read the addend. */
--#endif
--        Elf_Addr       *pAddrW =       (Elf_Addr *)(pu8SecBaseW + paRels[iRel].r_offset);    /* Where to write the fixup. */
-         switch (ELF_R_TYPE(paRels[iRel].r_info))
-         {
- #if   ELF_MODE == 32
-             /*
-+             * GOT/PLT.
-+             */
-+            case R_386_GLOB_DAT:
-+            {
-+                *(uint32_t *)pAddrW = (uint32_t)SymValue;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_386_GLOB_DAT Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, SymValue));
-+                AssertCompile(sizeof(SymValue) == sizeof(uint32_t));
-+                break;
-+            }
-+
-+            case R_386_JMP_SLOT:
-+            {
-+                *(uint32_t *)pAddrW = (uint32_t)SymValue;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_386_JMP_SLOT Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, SymValue));
-+                AssertCompile(sizeof(SymValue) == sizeof(uint32_t));
-+                break;
-+            }
-+
-+            /*
-              * Absolute addressing.
-              */
-             case R_386_32:
-@@ -322,7 +518,8 @@ static int RTLDRELF_NAME(RelocateSection
-                 else
-                     AssertFailedReturn(VERR_LDR_GENERAL_FAILURE); /** @todo SHN_COMMON */
-                 *(uint32_t *)pAddrW = Value;
--                Log4((FMT_ELF_ADDR": R_386_32   Value=" FMT_ELF_ADDR "\n", SecAddr + paRels[iRel].r_offset + BaseAddr, Value));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_386_32   Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value));
-                 break;
-             }
- 
-@@ -344,20 +541,42 @@ static int RTLDRELF_NAME(RelocateSection
-                 }
-                 else
-                     AssertFailedReturn(VERR_LDR_GENERAL_FAILURE); /** @todo SHN_COMMON */
--                Log4((FMT_ELF_ADDR": R_386_PC32 Value=" FMT_ELF_ADDR "\n", SecAddr + paRels[iRel].r_offset + BaseAddr, Value));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_386_PC32 Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value));
-                 break;
-             }
- 
- #elif ELF_MODE == 64
-+            /*
-+             * GOT/PLT.
-+             */
-+            case R_X86_64_GLOB_DAT:
-+            {
-+                *(uint64_t *)pAddrW = (uint64_t)SymValue;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_GLOB_DAT Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, SymValue));
-+                AssertCompile(sizeof(SymValue) == sizeof(uint64_t));
-+                break;
-+            }
-+
-+            case R_X86_64_JMP_SLOT:
-+            {
-+                *(uint64_t *)pAddrW = (uint64_t)SymValue;
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_JMP_SLOT Value=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, SymValue));
-+                AssertCompile(sizeof(SymValue) == sizeof(uint64_t));
-+                break;
-+            }
- 
-             /*
--             * Absolute addressing
-+             * Absolute addressing.
-              */
-             case R_X86_64_64:
-             {
-+                const Elf_Addr Value = SymValue + paRels[iRel].r_addend;
-                 *(uint64_t *)pAddrW = Value;
--                Log4((FMT_ELF_ADDR": R_X86_64_64   Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
--                      SecAddr + paRels[iRel].r_offset + BaseAddr, Value, SymValue));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_64   Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value, SymValue));
-                 break;
-             }
- 
-@@ -366,9 +585,10 @@ static int RTLDRELF_NAME(RelocateSection
-              */
-             case R_X86_64_32:
-             {
-+                const Elf_Addr Value = SymValue + paRels[iRel].r_addend;
-                 *(uint32_t *)pAddrW = (uint32_t)Value;
--                Log4((FMT_ELF_ADDR": R_X86_64_32   Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
--                      SecAddr + paRels[iRel].r_offset + BaseAddr, Value, SymValue));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_32   Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value, SymValue));
-                 AssertMsgReturn((Elf_Addr)*(uint32_t *)pAddrW == SymValue, ("Value=" FMT_ELF_ADDR "\n", SymValue),
-                                 VERR_SYMBOL_VALUE_TOO_BIG);
-                 break;
-@@ -379,9 +599,10 @@ static int RTLDRELF_NAME(RelocateSection
-              */
-             case R_X86_64_32S:
-             {
-+                const Elf_Addr Value = SymValue + paRels[iRel].r_addend;
-                 *(int32_t *)pAddrW = (int32_t)Value;
--                Log4((FMT_ELF_ADDR": R_X86_64_32S  Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
--                      SecAddr + paRels[iRel].r_offset + BaseAddr, Value, SymValue));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_32S  Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
-+                      SecAddr + paRels[iRel].r_offset + BaseAddr, paRels[iRel].r_offset, Value, SymValue));
-                 AssertMsgReturn((Elf_Addr)*(int32_t *)pAddrW == Value, ("Value=" FMT_ELF_ADDR "\n", Value), VERR_SYMBOL_VALUE_TOO_BIG); /** @todo check the sign-extending here. */
-                 break;
-             }
-@@ -390,18 +611,17 @@ static int RTLDRELF_NAME(RelocateSection
-              * PC relative addressing.
-              */
-             case R_X86_64_PC32:
--            case R_X86_64_PLT32: /* binutils commit 451875b4f976a527395e9303224c7881b65e12ed feature/regression. */
-             {
--                const Elf_Addr SourceAddr = SecAddr + paRels[iRel].r_offset + BaseAddr; /* Where the source really is. */
--                Value -= SourceAddr;
-+                const Elf_Addr SourceAddr = SecAddr  + paRels[iRel].r_offset + BaseAddr; /* Where the source really is. */
-+                const Elf_Addr Value      = SymValue + paRels[iRel].r_addend - SourceAddr;
-                 *(int32_t *)pAddrW = (int32_t)Value;
--                Log4((FMT_ELF_ADDR": R_X86_64_PC32 Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
--                      SourceAddr, Value, SymValue));
-+                Log4((FMT_ELF_ADDR "/" FMT_ELF_ADDR7 ": R_X86_64_PC32 Value=" FMT_ELF_ADDR " SymValue=" FMT_ELF_ADDR "\n",
-+                      SourceAddr, paRels[iRel].r_offset, Value, SymValue));
-                 AssertMsgReturn((Elf_Addr)*(int32_t *)pAddrW == Value, ("Value=" FMT_ELF_ADDR "\n", Value), VERR_SYMBOL_VALUE_TOO_BIG); /** @todo check the sign-extending here. */
-                 break;
-             }
--#endif
- 
-+#endif
-             default:
-                 AssertMsgFailed(("Unknown relocation type: %d (iRel=%d iRelMax=%d)\n",
-                                  ELF_R_TYPE(paRels[iRel].r_info), iRel, iRelMax));
-@@ -442,19 +662,13 @@ static int RTLDRELF_NAME(Symbol)(PRTLDRM
-     /*
-      * Validate and find the symbol.
-      */
--    if (iSym >= pModElf->cSyms)
--    {
--        AssertMsgFailed(("iSym=%d is an invalid symbol index!\n", iSym));
--        return VERR_LDRELF_INVALID_SYMBOL_INDEX;
--    }
--    const Elf_Sym *pSym = &pModElf->paSyms[iSym];
-+    AssertMsgReturn(iSym < pModElf->Rel.cSyms, ("iSym=%d is an invalid symbol index!\n", iSym), VERR_LDRELF_INVALID_SYMBOL_INDEX);
-+    const Elf_Sym *pSym = &pModElf->Rel.paSyms[iSym];
-     *ppSym = pSym;
- 
--    if (pSym->st_name >= pModElf->cbStr)
--    {
--        AssertMsgFailed(("iSym=%d st_name=%d str sh_size=%d\n", iSym, pSym->st_name, pModElf->cbStr));
--        return VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET;
--    }
-+    AssertMsgReturn(pSym->st_name < pModElf->Rel.cbStr,
-+                    ("iSym=%d st_name=%d str sh_size=%d\n", iSym, pSym->st_name, pModElf->Rel.cbStr),
-+                    VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET);
-     const char *pszName = ELF_STR(pModElf, pSym->st_name);
- 
-     /*
-@@ -469,7 +683,7 @@ static int RTLDRELF_NAME(Symbol)(PRTLDRM
-          * Undefined symbol, needs resolving.
-          *
-          * Since ELF has no generic concept of importing from specific module (the OS/2 ELF format
--         * has but that's a OS extension and only applies to programs and dlls), we'll have to ask
-+         * has but that's an OS extension and only applies to programs and dlls), we'll have to ask
-          * the resolver callback to do a global search.
-          */
-         case SHN_UNDEF:
-@@ -477,17 +691,12 @@ static int RTLDRELF_NAME(Symbol)(PRTLDRM
-             /* Try to resolve the symbol. */
-             RTUINTPTR Value;
-             int rc = pfnGetImport(&pModElf->Core, "", pszName, ~0U, &Value, pvUser);
--            if (RT_FAILURE(rc))
--            {
--                AssertMsgFailed(("Failed to resolve '%s' rc=%Rrc\n", pszName, rc));
--                return rc;
--            }
-+            AssertMsgRCReturn(rc, ("Failed to resolve '%s' (iSym=" FMT_ELF_SIZE " rc=%Rrc\n", pszName, iSym, rc), rc);
-             *pSymValue = (Elf_Addr)Value;
--            if ((RTUINTPTR)*pSymValue != Value)
--            {
--                AssertMsgFailed(("Symbol value overflowed! '%s'\n", pszName));
--                return VERR_SYMBOL_VALUE_TOO_BIG;
--            }
-+
-+            AssertMsgReturn((RTUINTPTR)*pSymValue == Value,
-+                            ("Symbol value overflowed! '%s' (iSym=" FMT_ELF_SIZE ")\n", pszName, iSym),
-+                            VERR_SYMBOL_VALUE_TOO_BIG);
- 
-             Log2(("rtldrELF: #%-3d - UNDEF " FMT_ELF_ADDR " '%s'\n", iSym, *pSymValue, pszName));
-             break;
-@@ -536,9 +745,9 @@ static int RTLDRELF_NAME(Symbol)(PRTLDRM
-  * @param   pvRelocs        Pointer to where we read the relocations from.
-  * @param   cbRelocs        Size of the relocations.
-  */
--static int RTLDRELF_NAME(RelocateSection)(PRTLDRMODELF pModElf, Elf_Addr BaseAddr, PFNRTLDRIMPORT pfnGetImport, void *pvUser,
--                                          const Elf_Addr SecAddr, Elf_Size cbSec, const uint8_t *pu8SecBaseR, uint8_t *pu8SecBaseW,
--                                          const void *pvRelocs, Elf_Size cbRelocs)
-+static int RTLDRELF_NAME(RelocateSectionRel)(PRTLDRMODELF pModElf, Elf_Addr BaseAddr, PFNRTLDRIMPORT pfnGetImport, void *pvUser,
-+                                             const Elf_Addr SecAddr, Elf_Size cbSec, const uint8_t *pu8SecBaseR,
-+                                             uint8_t *pu8SecBaseW, const void *pvRelocs, Elf_Size cbRelocs)
- {
- #if ELF_MODE != 32
-     NOREF(pu8SecBaseR);
-@@ -702,6 +911,18 @@ static DECLCALLBACK(int) RTLDRELF_NAME(C
-         pModElf->paShdrs = NULL;
-     }
- 
-+    if (pModElf->paPhdrs)
-+    {
-+        RTMemFree(pModElf->paPhdrs);
-+        pModElf->paPhdrs = NULL;
-+    }
-+
-+    if (pModElf->paDynamic)
-+    {
-+        RTMemFree(pModElf->paDynamic);
-+        pModElf->paDynamic = NULL;
-+    }
-+
-     if (pModElf->pvBits)
-     {
-         pModElf->Core.pReader->pfnUnmap(pModElf->Core.pReader, pModElf->pvBits);
-@@ -721,9 +942,9 @@ static DECLCALLBACK(int) RTLDRELF_NAME(D
- }
- 
- 
--/** @copydoc RTLDROPS::EnumSymbols */
--static DECLCALLBACK(int) RTLDRELF_NAME(EnumSymbols)(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress,
--                                                    PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
-+/** @copydoc RTLDROPS::pfnEnumSymbols */
-+static DECLCALLBACK(int) RTLDRELF_NAME(EnumSymbols)(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits,
-+                                                    RTUINTPTR BaseAddress, PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
- {
-     PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
-     NOREF(pvBits);
-@@ -744,8 +965,20 @@ static DECLCALLBACK(int) RTLDRELF_NAME(E
-     /*
-      * Enumerate the symbol table.
-      */
--    const Elf_Sym  *paSyms = pModElf->paSyms;
--    unsigned        cSyms  = pModElf->cSyms;
-+    const Elf_Sym  *paSyms  = pModElf->Rel.paSyms;
-+    unsigned        cSyms   = pModElf->Rel.cSyms;
-+    const char     *pszzStr = pModElf->Rel.pStr;
-+    unsigned        cbStr   = pModElf->Rel.cbStr;
-+    if (   (   !(fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL)
-+            && pModElf->Dyn.cSyms > 0)
-+        || cSyms == 0)
-+    {
-+        paSyms  = pModElf->Dyn.paSyms;
-+        cSyms   = pModElf->Dyn.cSyms;
-+        pszzStr = pModElf->Dyn.pStr;
-+        cbStr   = pModElf->Dyn.cbStr;
-+    }
-+
-     for (unsigned iSym = 1; iSym < cSyms; iSym++)
-     {
-         /*
-@@ -774,22 +1007,21 @@ static DECLCALLBACK(int) RTLDRELF_NAME(E
-                 return VERR_BAD_EXE_FORMAT;
-             }
- 
--            AssertMsgReturn(paSyms[iSym].st_name < pModElf->cbStr,
-+            AssertMsgReturn(paSyms[iSym].st_name < cbStr,
-                             ("String outside string table! iSym=%d paSyms[iSym].st_name=%#x\n", iSym, paSyms[iSym].st_name),
-                             VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET);
-+            const char * const pszName = pszzStr + paSyms[iSym].st_name;
- 
--            const char *pszName = ELF_STR(pModElf, paSyms[iSym].st_name);
-             /* String termination was already checked when the string table was mapped. */
--            if (    (pszName && *pszName)
-+            if (    *pszName != '\0'
-                 &&  (   (fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL)
--                     || ELF_ST_BIND(paSyms[iSym].st_info) == STB_GLOBAL)
--               )
-+                     || ELF_ST_BIND(paSyms[iSym].st_info) == STB_GLOBAL) )
-             {
-                 /*
-                  * Call back.
-                  */
-                 AssertMsgReturn(Value == (RTUINTPTR)Value, (FMT_ELF_ADDR "\n", Value), VERR_SYMBOL_VALUE_TOO_BIG);
--                rc = pfnCallback(pMod, pszName, ~0U, (RTUINTPTR)Value, pvUser);
-+                rc = pfnCallback(pMod, pszName, iSym, (RTUINTPTR)Value, pvUser);
-                 if (rc)
-                     return rc;
-             }
-@@ -820,13 +1052,11 @@ static DECLCALLBACK(int) RTLDRELF_NAME(G
-     switch (pModElf->Ehdr.e_type)
-     {
-         case ET_REL:
-+        case ET_DYN:
-             break;
-         case ET_EXEC:
-             Log(("RTLdrELF: %s: Executable images are not supported yet!\n", pModElf->Core.pReader->pfnLogName(pModElf->Core.pReader)));
-             return VERR_LDRELF_EXEC;
--        case ET_DYN:
--            Log(("RTLdrELF: %s: Dynamic images are not supported yet!\n", pModElf->Core.pReader->pfnLogName(pModElf->Core.pReader)));
--            return VERR_LDRELF_DYN;
-         default: AssertFailedReturn(VERR_BAD_EXE_FORMAT);
-     }
- 
-@@ -885,13 +1115,11 @@ static DECLCALLBACK(int) RTLDRELF_NAME(R
-     switch (pModElf->Ehdr.e_type)
-     {
-         case ET_REL:
-+        case ET_DYN:
-             break;
-         case ET_EXEC:
-             Log(("RTLdrELF: %s: Executable images are not supported yet!\n", pszLogName));
-             return VERR_LDRELF_EXEC;
--        case ET_DYN:
--            Log(("RTLdrELF: %s: Dynamic images are not supported yet!\n", pszLogName));
--            return VERR_LDRELF_DYN;
-         default: AssertFailedReturn(VERR_BAD_EXE_FORMAT);
-     }
- 
-@@ -910,8 +1138,9 @@ static DECLCALLBACK(int) RTLDRELF_NAME(R
- 
-     /*
-      * Iterate the sections looking for interesting SHT_REL[A] sections.
--     * SHT_REL[A] sections have the section index of the section they contain fixups
--     * for in the sh_info member.
-+     *
-+     * In ET_REL files the SHT_REL[A] sections have the section index of
-+     * the section they contain fixups for in the sh_info member.
-      */
-     const Elf_Shdr *paShdrs = pModElf->paShdrs;
-     Log2(("rtLdrElf: %s: Fixing up image\n", pszLogName));
-@@ -928,36 +1157,37 @@ static DECLCALLBACK(int) RTLDRELF_NAME(R
-         if (pShdrRel->sh_type != SHT_RELA)
- #endif
-             continue;
--        if (pShdrRel->sh_info >= pModElf->Ehdr.e_shnum)
--            continue;
--        const Elf_Shdr *pShdr = &paShdrs[pShdrRel->sh_info]; /* the section to fixup. */
--        if (!(pShdr->sh_flags & SHF_ALLOC))
--            continue;
--
--        /*
--         * Relocate the section.
--         */
--        Log2(("rtldrELF: %s: Relocation records for #%d [%s] (sh_info=%d sh_link=%d) found in #%d [%s] (sh_info=%d sh_link=%d)\n",
--              pszLogName, (int)pShdrRel->sh_info, ELF_SH_STR(pModElf, pShdr->sh_name), (int)pShdr->sh_info, (int)pShdr->sh_link,
--              iShdr, ELF_SH_STR(pModElf, pShdrRel->sh_name), (int)pShdrRel->sh_info, (int)pShdrRel->sh_link));
--
--        /** @todo Make RelocateSection a function pointer so we can select the one corresponding to the machine when opening the image. */
-         if (pModElf->Ehdr.e_type == ET_REL)
--            rc = RTLDRELF_NAME(RelocateSection)(pModElf, BaseAddr, pfnGetImport, pvUser,
--                                                pShdr->sh_addr,
--                                                pShdr->sh_size,
--                                                (const uint8_t *)pModElf->pvBits + pShdr->sh_offset,
--                                                (uint8_t *)pvBits + pShdr->sh_addr,
--                                                (const uint8_t *)pModElf->pvBits + pShdrRel->sh_offset,
--                                                pShdrRel->sh_size);
-+        {
-+            if (pShdrRel->sh_info >= pModElf->Ehdr.e_shnum)
-+                continue;
-+            const Elf_Shdr *pShdr = &paShdrs[pShdrRel->sh_info]; /* the section to fixup. */
-+            if (!(pShdr->sh_flags & SHF_ALLOC))
-+                continue;
-+
-+            /*
-+             * Relocate the section.
-+             */
-+            Log2(("rtldrELF: %s: Relocation records for #%d [%s] (sh_info=%d sh_link=%d) found in #%d [%s] (sh_info=%d sh_link=%d)\n",
-+                  pszLogName, (int)pShdrRel->sh_info, ELF_SH_STR(pModElf, pShdr->sh_name), (int)pShdr->sh_info, (int)pShdr->sh_link,
-+                  iShdr, ELF_SH_STR(pModElf, pShdrRel->sh_name), (int)pShdrRel->sh_info, (int)pShdrRel->sh_link));
-+
-+            rc = RTLDRELF_NAME(RelocateSectionRel)(pModElf, BaseAddr, pfnGetImport, pvUser,
-+                                                   pShdr->sh_addr,
-+                                                   pShdr->sh_size,
-+                                                   (const uint8_t *)pModElf->pvBits + pShdr->sh_offset,
-+                                                   (uint8_t *)pvBits + pShdr->sh_addr,
-+                                                   (const uint8_t *)pModElf->pvBits + pShdrRel->sh_offset,
-+                                                   pShdrRel->sh_size);
-+        }
-         else
-             rc = RTLDRELF_NAME(RelocateSectionExecDyn)(pModElf, BaseAddr, pfnGetImport, pvUser,
--                                                       pShdr->sh_addr,
--                                                       pShdr->sh_size,
--                                                       (const uint8_t *)pModElf->pvBits + pShdr->sh_offset,
--                                                       (uint8_t *)pvBits + pShdr->sh_addr,
-+                                                       0, (Elf_Size)pModElf->cbImage,
-+                                                       (const uint8_t *)pModElf->pvBits /** @todo file offset ?? */,
-+                                                       (uint8_t *)pvBits,
-                                                        (const uint8_t *)pModElf->pvBits + pShdrRel->sh_offset,
-                                                        pShdrRel->sh_size);
-+
-         if (RT_FAILURE(rc))
-             return rc;
-     }
-@@ -1016,11 +1246,20 @@ static DECLCALLBACK(int) RTLDRELF_NAME(G
-     /*
-      * Calc all kinds of pointers before we start iterating the symbol table.
-      */
--    const Elf_Sym     *paSyms = pModElf->paSyms;
--    unsigned            cSyms = pModElf->cSyms;
-+    const Elf_Sym *paSyms  = pModElf->Rel.paSyms;
-+    unsigned       cSyms   = pModElf->Rel.cSyms;
-+    const char    *pszzStr = pModElf->Rel.pStr;
-+    unsigned       cbStr   = pModElf->Rel.cbStr;
-+    if (pModElf->Dyn.cSyms > 0)
-+    {
-+        paSyms  = pModElf->Dyn.paSyms;
-+        cSyms   = pModElf->Dyn.cSyms;
-+        pszzStr = pModElf->Dyn.pStr;
-+        cbStr   = pModElf->Dyn.cbStr;
-+    }
-+
-     if (iOrdinal == UINT32_MAX)
-     {
--        const char     *pStr  = pModElf->pStr;
-         for (unsigned iSym = 1; iSym < cSyms; iSym++)
-         {
-             /* Undefined symbols are not exports, they are imports. */
-@@ -1029,18 +1268,13 @@ static DECLCALLBACK(int) RTLDRELF_NAME(G
-                      || ELF_ST_BIND(paSyms[iSym].st_info) == STB_WEAK))
-             {
-                 /* Validate the name string and try match with it. */
--                if (paSyms[iSym].st_name < pModElf->cbStr)
--                {
--                    if (!strcmp(pszSymbol, pStr + paSyms[iSym].st_name))
--                    {
--                        /* matched! */
--                        return RTLDRELF_NAME(ReturnSymbol)(pModElf, &paSyms[iSym], uBaseAddr, pValue);
--                    }
--                }
--                else
-+                AssertMsgReturn(paSyms[iSym].st_name < cbStr,
-+                                ("String outside string table! iSym=%d paSyms[iSym].st_name=%#x\n", iSym, paSyms[iSym].st_name),
-+                                VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET);
-+                if (!strcmp(pszSymbol, pszzStr + paSyms[iSym].st_name))
-                 {
--                    AssertMsgFailed(("String outside string table! iSym=%d paSyms[iSym].st_name=%#x\n", iSym, paSyms[iSym].st_name));
--                    return VERR_LDRELF_INVALID_SYMBOL_NAME_OFFSET;
-+                    /* matched! */
-+                    return RTLDRELF_NAME(ReturnSymbol)(pModElf, &paSyms[iSym], uBaseAddr, pValue);
-                 }
-             }
-         }
-@@ -1127,23 +1361,47 @@ static DECLCALLBACK(int) RTLDRELF_NAME(E
- 
- 
- /**
-- * Helper that locates the first allocated section.
-+ * Locate the next allocated section by RVA (sh_addr).
-+ *
-+ * This is a helper for EnumSegments and SegOffsetToRva.
-  *
-  * @returns Pointer to the section header if found, NULL if none.
-- * @param   pShdr   The section header to start searching at.
-- * @param   cLeft   The number of section headers left to search. Can be 0.
-+ * @param   pModElf     The module instance.
-+ * @param   iShdrCur    The current section header.
-  */
--static const Elf_Shdr *RTLDRELF_NAME(GetFirstAllocatedSection)(const Elf_Shdr *pShdr, unsigned cLeft)
-+static const Elf_Shdr *RTLDRELF_NAME(GetNextAllocatedSection)(PRTLDRMODELF pModElf, unsigned iShdrCur)
- {
--    while (cLeft-- > 0)
-+    unsigned const          cShdrs  = pModElf->Ehdr.e_shnum;
-+    const Elf_Shdr * const  paShdrs = pModElf->paShdrs;
-+    if (pModElf->fShdrInOrder)
-+    {
-+        for (unsigned iShdr = iShdrCur + 1; iShdr < cShdrs; iShdr++)
-+            if (paShdrs[iShdr].sh_flags & SHF_ALLOC)
-+                return &paShdrs[iShdr];
-+    }
-+    else
-     {
--        if (pShdr->sh_flags & SHF_ALLOC)
--            return pShdr;
--        pShdr++;
-+        Elf_Addr const uEndCur = paShdrs[iShdrCur].sh_addr + paShdrs[iShdrCur].sh_size;
-+        Elf_Addr       offBest = ~(Elf_Addr)0;
-+        unsigned       iBest   = cShdrs;
-+        for (unsigned iShdr = pModElf->iFirstSect; iShdr < cShdrs; iShdr++)
-+            if ((paShdrs[iShdr].sh_flags & SHF_ALLOC) && iShdr != iShdrCur)
-+            {
-+                Elf_Addr const offDelta = paShdrs[iShdr].sh_addr - uEndCur;
-+                if (   offDelta < offBest
-+                    && paShdrs[iShdr].sh_addr >= uEndCur)
-+                {
-+                    offBest = offDelta;
-+                    iBest   = iShdr;
-+                }
-+            }
-+        if (iBest < cShdrs)
-+            return &paShdrs[iBest];
-     }
-     return NULL;
- }
- 
-+
- /** @copydoc RTLDROPS::pfnEnumSegments. */
- static DECLCALLBACK(int) RTLDRELF_NAME(EnumSegments)(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
- {
-@@ -1163,15 +1421,23 @@ static DECLCALLBACK(int) RTLDRELF_NAME(E
-     Elf_Addr        uPrevMappedRva = 0;
-     const Elf_Shdr *paShdrs    = pModElf->paShdrs;
-     const Elf_Shdr *paOrgShdrs = pModElf->paOrgShdrs;
--    for (unsigned iShdr = 1; iShdr < pModElf->Ehdr.e_shnum; iShdr++)
-+    for (unsigned iShdr = pModElf->iFirstSect; iShdr < pModElf->Ehdr.e_shnum; iShdr++)
-     {
-         RTLDRSEG Seg;
--        Seg.pszName     = ELF_SH_STR(pModElf, paShdrs[iShdr].sh_name);
--        Seg.cchName     = (uint32_t)strlen(Seg.pszName);
--        if (Seg.cchName == 0)
-+        if (iShdr != 0)
-+        {
-+            Seg.pszName     = ELF_SH_STR(pModElf, paShdrs[iShdr].sh_name);
-+            Seg.cchName     = (uint32_t)strlen(Seg.pszName);
-+            if (Seg.cchName == 0)
-+            {
-+                Seg.pszName = szName;
-+                Seg.cchName = (uint32_t)RTStrPrintf(szName, sizeof(szName), "UnamedSect%02u", iShdr);
-+            }
-+        }
-+        else
-         {
--            Seg.pszName = szName;
--            Seg.cchName = (uint32_t)RTStrPrintf(szName, sizeof(szName), "UnamedSect%02u", iShdr);
-+            Seg.pszName = ".elf.headers";
-+            Seg.cchName = 12;
-         }
-         Seg.SelFlat     = 0;
-         Seg.Sel16bit    = 0;
-@@ -1187,14 +1453,11 @@ static DECLCALLBACK(int) RTLDRELF_NAME(E
-         {
-             Seg.LinkAddress = paOrgShdrs[iShdr].sh_addr;
-             Seg.RVA         = paShdrs[iShdr].sh_addr;
--            const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetFirstAllocatedSection)(&paShdrs[iShdr + 1],
--                                                                             pModElf->Ehdr.e_shnum - iShdr - 1);
--            if (   pShdr2
--                && pShdr2->sh_addr >= paShdrs[iShdr].sh_addr
--                && Seg.RVA >= uPrevMappedRva)
-+            const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetNextAllocatedSection)(pModElf, iShdr);
-+            if (pShdr2)
-                 Seg.cbMapped = pShdr2->sh_addr - paShdrs[iShdr].sh_addr;
-             else
--                Seg.cbMapped = RT_MAX(paShdrs[iShdr].sh_size, paShdrs[iShdr].sh_addralign);
-+                Seg.cbMapped = pModElf->cbImage - paShdrs[iShdr].sh_addr;
-             uPrevMappedRva = Seg.RVA;
-         }
-         else
-@@ -1230,10 +1493,11 @@ static DECLCALLBACK(int) RTLDRELF_NAME(L
-     PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
- 
-     const Elf_Shdr *pShdrEnd = NULL;
--    unsigned        cLeft    = pModElf->Ehdr.e_shnum - 1;
--    const Elf_Shdr *pShdr    = &pModElf->paOrgShdrs[cLeft];
-+    unsigned        cLeft    = pModElf->Ehdr.e_shnum - pModElf->iFirstSect;
-+    const Elf_Shdr *pShdr    = &pModElf->paOrgShdrs[pModElf->Ehdr.e_shnum];
-     while (cLeft-- > 0)
-     {
-+        pShdr--;
-         if (pShdr->sh_flags & SHF_ALLOC)
-         {
-             RTLDRADDR offSeg = LinkAddress - pShdr->sh_addr;
-@@ -1246,13 +1510,12 @@ static DECLCALLBACK(int) RTLDRELF_NAME(L
-             if (offSeg == pShdr->sh_size)
-                 pShdrEnd = pShdr;
-         }
--        pShdr--;
-     }
- 
-     if (pShdrEnd)
-     {
-         *poffSeg = pShdrEnd->sh_size;
--        *piSeg   = pShdrEnd - pModElf->paOrgShdrs - 1;
-+        *piSeg   = pShdrEnd - pModElf->paOrgShdrs - pModElf->iFirstSect;
-         return VINF_SUCCESS;
-     }
- 
-@@ -1268,7 +1531,7 @@ static DECLCALLBACK(int) RTLDRELF_NAME(L
-     RTLDRADDR    offSeg;
-     int rc = RTLDRELF_NAME(LinkAddressToSegOffset)(pMod, LinkAddress, &iSeg, &offSeg);
-     if (RT_SUCCESS(rc))
--        *pRva = pModElf->paShdrs[iSeg + 1].sh_addr + offSeg;
-+        *pRva = pModElf->paShdrs[iSeg + pModElf->iFirstSect].sh_addr + offSeg;
-     return rc;
- }
- 
-@@ -1278,14 +1541,13 @@ static DECLCALLBACK(int) RTLDRELF_NAME(S
-                                                        PRTLDRADDR pRva)
- {
-     PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
--    if (iSeg >= pModElf->Ehdr.e_shnum - 1U)
-+    if (iSeg >= pModElf->Ehdr.e_shnum - pModElf->iFirstSect)
-         return VERR_LDR_INVALID_SEG_OFFSET;
- 
--    iSeg++; /* skip section 0 */
-+    iSeg += pModElf->iFirstSect; /* skip section 0 if not used */
-     if (offSeg > pModElf->paShdrs[iSeg].sh_size)
-     {
--        const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetFirstAllocatedSection)(&pModElf->paShdrs[iSeg + 1],
--                                                                         pModElf->Ehdr.e_shnum - iSeg - 1);
-+        const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetNextAllocatedSection)(pModElf, iSeg);
-         if (   !pShdr2
-             || offSeg > (pShdr2->sh_addr - pModElf->paShdrs[iSeg].sh_addr))
-             return VERR_LDR_INVALID_SEG_OFFSET;
-@@ -1303,13 +1565,13 @@ static DECLCALLBACK(int) RTLDRELF_NAME(S
- static DECLCALLBACK(int) RTLDRELF_NAME(RvaToSegOffset)(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
-                                                        uint32_t *piSeg, PRTLDRADDR poffSeg)
- {
--    PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
--
-+    PRTLDRMODELF    pModElf  = (PRTLDRMODELF)pMod;
-     Elf_Addr        PrevAddr = 0;
--    unsigned        cLeft    = pModElf->Ehdr.e_shnum - 1;
--    const Elf_Shdr *pShdr    = &pModElf->paShdrs[cLeft];
-+    unsigned        cLeft    = pModElf->Ehdr.e_shnum - pModElf->iFirstSect;
-+    const Elf_Shdr *pShdr    = &pModElf->paShdrs[pModElf->Ehdr.e_shnum];
-     while (cLeft-- > 0)
-     {
-+        pShdr--;
-         if (pShdr->sh_flags & SHF_ALLOC)
-         {
-             Elf_Addr    cbSeg  = PrevAddr ? PrevAddr - pShdr->sh_addr : pShdr->sh_size;
-@@ -1322,7 +1584,6 @@ static DECLCALLBACK(int) RTLDRELF_NAME(R
-             }
-             PrevAddr = pShdr->sh_addr;
-         }
--        pShdr--;
-     }
- 
-     return VERR_LDR_INVALID_RVA;
-@@ -1413,14 +1674,14 @@ static DECLCALLBACK(int) RTLDRELF_NAME(R
-          * Apply the relocations.
-          */
-         if (pThis->Ehdr.e_type == ET_REL)
--            rc = RTLDRELF_NAME(RelocateSection)(pThis, pThis->LinkAddress,
--                                                RTLDRELF_NAME(GetImportStubCallback), NULL /*pvUser*/,
--                                                pThis->paShdrs[iDbgInfo].sh_addr,
--                                                pThis->paShdrs[iDbgInfo].sh_size,
--                                                (const uint8_t *)pvBuf,
--                                                (uint8_t *)pvBuf,
--                                                pbRelocs,
--                                                pThis->paShdrs[iRelocs].sh_size);
-+            rc = RTLDRELF_NAME(RelocateSectionRel)(pThis, pThis->LinkAddress,
-+                                                   RTLDRELF_NAME(GetImportStubCallback), NULL /*pvUser*/,
-+                                                   pThis->paShdrs[iDbgInfo].sh_addr,
-+                                                   pThis->paShdrs[iDbgInfo].sh_size,
-+                                                   (const uint8_t *)pvBuf,
-+                                                   (uint8_t *)pvBuf,
-+                                                   pbRelocs,
-+                                                   pThis->paShdrs[iRelocs].sh_size);
-         else
-             rc = RTLDRELF_NAME(RelocateSectionExecDyn)(pThis, pThis->LinkAddress,
-                                                        RTLDRELF_NAME(GetImportStubCallback), NULL /*pvUser*/,
-@@ -1562,11 +1823,13 @@ static RTLDROPS RTLDRELF_MID(s_rtldrElf,
-  *
-  * @returns iprt status code.
-  * @param   pEhdr       Pointer to the ELF header.
-- * @param   pszLogName  The log name.
-  * @param   cbRawImage  The size of the raw image.
-+ * @param   pszLogName  The log name.
-+ * @param   penmArch    Where to return the architecture.
-+ * @param   pErrInfo    Where to return extended error info. Optional.
-  */
--static int RTLDRELF_NAME(ValidateElfHeader)(const Elf_Ehdr *pEhdr, const char *pszLogName, uint64_t cbRawImage,
--                                            PRTLDRARCH penmArch)
-+static int RTLDRELF_NAME(ValidateElfHeader)(const Elf_Ehdr *pEhdr, uint64_t cbRawImage, const char *pszLogName,
-+                                            PRTLDRARCH penmArch, PRTERRINFO pErrInfo)
- {
-     Log3(("RTLdrELF:     e_ident: %.*Rhxs\n"
-           "RTLdrELF:      e_type: " FMT_ELF_HALF "\n"
-@@ -1588,48 +1851,31 @@ static int RTLDRELF_NAME(ValidateElfHead
-     if (    pEhdr->e_ident[EI_MAG0] != ELFMAG0
-         ||  pEhdr->e_ident[EI_MAG1] != ELFMAG1
-         ||  pEhdr->e_ident[EI_MAG2] != ELFMAG2
--        ||  pEhdr->e_ident[EI_MAG3] != ELFMAG3
--       )
--    {
--        Log(("RTLdrELF: %s: Invalid ELF magic (%.*Rhxs)\n", pszLogName, sizeof(pEhdr->e_ident), pEhdr->e_ident)); NOREF(pszLogName);
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        ||  pEhdr->e_ident[EI_MAG3] != ELFMAG3)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Invalid ELF magic (%.*Rhxs)", pszLogName, sizeof(pEhdr->e_ident), pEhdr->e_ident);
-     if (pEhdr->e_ident[EI_CLASS] != RTLDRELF_SUFF(ELFCLASS))
--    {
--        Log(("RTLdrELF: %s: Invalid ELF class (%.*Rhxs)\n", pszLogName, sizeof(pEhdr->e_ident), pEhdr->e_ident));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Invalid ELF class (%.*Rhxs)", pszLogName, sizeof(pEhdr->e_ident), pEhdr->e_ident);
-     if (pEhdr->e_ident[EI_DATA] != ELFDATA2LSB)
--    {
--        Log(("RTLdrELF: %s: ELF endian %x is unsupported\n", pszLogName, pEhdr->e_ident[EI_DATA]));
--        return VERR_LDRELF_ODD_ENDIAN;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_ODD_ENDIAN,
-+                                   "%s: ELF endian %x is unsupported", pszLogName, pEhdr->e_ident[EI_DATA]);
-     if (pEhdr->e_version != EV_CURRENT)
--    {
--        Log(("RTLdrELF: %s: ELF version %x is unsupported\n", pszLogName, pEhdr->e_version));
--        return VERR_LDRELF_VERSION;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_VERSION,
-+                                   "%s: ELF version %x is unsupported", pszLogName, pEhdr->e_version);
- 
-     if (sizeof(Elf_Ehdr) != pEhdr->e_ehsize)
--    {
--        Log(("RTLdrELF: %s: Elf header e_ehsize is %d expected %d!\n",
--             pszLogName, pEhdr->e_ehsize, sizeof(Elf_Ehdr)));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Elf header e_ehsize is %d expected %d!", pszLogName, pEhdr->e_ehsize, sizeof(Elf_Ehdr));
-     if (    sizeof(Elf_Phdr) != pEhdr->e_phentsize
--        &&  (    pEhdr->e_phnum != 0
--             ||  pEhdr->e_type == ET_DYN))
--    {
--        Log(("RTLdrELF: %s: Elf header e_phentsize is %d expected %d!\n",
--             pszLogName, pEhdr->e_phentsize, sizeof(Elf_Phdr)));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        &&  (   pEhdr->e_phnum != 0
-+             || pEhdr->e_type == ET_DYN
-+             || pEhdr->e_type == ET_EXEC))
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Elf header e_phentsize is %d expected %d!",
-+                                   pszLogName, pEhdr->e_phentsize, sizeof(Elf_Phdr));
-     if (sizeof(Elf_Shdr) != pEhdr->e_shentsize)
--    {
--        Log(("RTLdrELF: %s: Elf header e_shentsize is %d expected %d!\n",
--             pszLogName, pEhdr->e_shentsize, sizeof(Elf_Shdr)));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Elf header e_shentsize is %d expected %d!",
-+                                   pszLogName, pEhdr->e_shentsize, sizeof(Elf_Shdr));
- 
-     switch (pEhdr->e_type)
-     {
-@@ -1638,8 +1884,8 @@ static int RTLDRELF_NAME(ValidateElfHead
-         case ET_DYN:
-             break;
-         default:
--            Log(("RTLdrELF: %s: image type %#x is not supported!\n", pszLogName, pEhdr->e_type));
--            return VERR_BAD_EXE_FORMAT;
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: image type %#x is not supported!",
-+                                       pszLogName, pEhdr->e_type);
-     }
- 
-     switch (pEhdr->e_machine)
-@@ -1655,52 +1901,43 @@ static int RTLDRELF_NAME(ValidateElfHead
-             break;
- #endif
-         default:
--            Log(("RTLdrELF: %s: machine type %u is not supported!\n", pszLogName, pEhdr->e_machine));
--            return VERR_LDRELF_MACHINE;
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_MACHINE,
-+                                       "%s: machine type %u is not supported!", pszLogName, pEhdr->e_machine);
-     }
- 
-     if (    pEhdr->e_phoff < pEhdr->e_ehsize
-         &&  !(pEhdr->e_phoff && pEhdr->e_phnum)
-         &&  pEhdr->e_phnum)
--    {
--        Log(("RTLdrELF: %s: The program headers overlap with the ELF header! e_phoff=" FMT_ELF_OFF "\n",
--             pszLogName, pEhdr->e_phoff));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: The program headers overlap with the ELF header! e_phoff=" FMT_ELF_OFF,
-+                                   pszLogName, pEhdr->e_phoff);
-     if (    pEhdr->e_phoff + pEhdr->e_phnum * pEhdr->e_phentsize > cbRawImage
-         ||  pEhdr->e_phoff + pEhdr->e_phnum * pEhdr->e_phentsize < pEhdr->e_phoff)
--    {
--        Log(("RTLdrELF: %s: The program headers extends beyond the file! e_phoff=" FMT_ELF_OFF " e_phnum=" FMT_ELF_HALF "\n",
--             pszLogName, pEhdr->e_phoff, pEhdr->e_phnum));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: The program headers extends beyond the file! e_phoff=" FMT_ELF_OFF " e_phnum=" FMT_ELF_HALF,
-+                                   pszLogName, pEhdr->e_phoff, pEhdr->e_phnum);
- 
- 
-     if (    pEhdr->e_shoff < pEhdr->e_ehsize
-         &&  !(pEhdr->e_shoff && pEhdr->e_shnum))
--    {
--        Log(("RTLdrELF: %s: The section headers overlap with the ELF header! e_shoff=" FMT_ELF_OFF "\n",
--             pszLogName, pEhdr->e_shoff));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: The section headers overlap with the ELF header! e_shoff=" FMT_ELF_OFF,
-+                                   pszLogName, pEhdr->e_shoff);
-     if (    pEhdr->e_shoff + pEhdr->e_shnum * pEhdr->e_shentsize > cbRawImage
-         ||  pEhdr->e_shoff + pEhdr->e_shnum * pEhdr->e_shentsize < pEhdr->e_shoff)
--    {
--        Log(("RTLdrELF: %s: The section headers extends beyond the file! e_shoff=" FMT_ELF_OFF " e_shnum=" FMT_ELF_HALF "\n",
--             pszLogName, pEhdr->e_shoff, pEhdr->e_shnum));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: The section headers extends beyond the file! e_shoff=" FMT_ELF_OFF " e_shnum=" FMT_ELF_HALF,
-+                                   pszLogName, pEhdr->e_shoff, pEhdr->e_shnum);
- 
-     if (pEhdr->e_shstrndx == 0 || pEhdr->e_shstrndx > pEhdr->e_shnum)
--    {
--        Log(("RTLdrELF: %s: The section headers string table is out of bounds! e_shstrndx=" FMT_ELF_HALF " e_shnum=" FMT_ELF_HALF "\n",
--             pszLogName, pEhdr->e_shstrndx, pEhdr->e_shnum));
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: The section headers string table is out of bounds! e_shstrndx=" FMT_ELF_HALF " e_shnum=" FMT_ELF_HALF,
-+                                   pszLogName, pEhdr->e_shstrndx, pEhdr->e_shnum);
- 
-     return VINF_SUCCESS;
- }
- 
-+
- /**
-  * Gets the section header name.
-  *
-@@ -1741,10 +1978,12 @@ const char *RTLDRELF_NAME(GetSHdrName)(P
-  * @param   pModElf     Pointer to the module structure.
-  * @param   iShdr       The index of section header which should be validated.
-  *                      The section headers are found in the pModElf->paShdrs array.
-- * @param   pszLogName  The log name.
-  * @param   cbRawImage  The size of the raw image.
-+ * @param   pszLogName  The log name.
-+ * @param   pErrInfo    Where to return extended error info. Optional.
-  */
--static int RTLDRELF_NAME(ValidateSectionHeader)(PRTLDRMODELF pModElf, unsigned iShdr, const char *pszLogName, uint64_t cbRawImage)
-+static int RTLDRELF_NAME(ValidateSectionHeader)(PRTLDRMODELF pModElf, unsigned iShdr, uint64_t cbRawImage,
-+                                                const char *pszLogName, PRTERRINFO pErrInfo)
- {
-     const Elf_Shdr *pShdr = &pModElf->paShdrs[iShdr];
-     char szSectionName[80]; NOREF(szSectionName);
-@@ -1776,37 +2015,29 @@ static int RTLDRELF_NAME(ValidateSection
-             || pShdr->sh_link       != SHN_UNDEF
-             || pShdr->sh_addralign  != 0
-             || pShdr->sh_entsize    != 0 )
--        {
--            Log(("RTLdrELF: %s: Bad #0 section: %.*Rhxs\n", pszLogName, sizeof(*pShdr), pShdr ));
--            return VERR_BAD_EXE_FORMAT;
--        }
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: Bad #0 section: %.*Rhxs", pszLogName, sizeof(*pShdr), pShdr);
-         return VINF_SUCCESS;
-     }
- 
-     if (pShdr->sh_name >= pModElf->cbShStr)
--    {
--        Log(("RTLdrELF: %s: Shdr #%d: sh_name (%d) is beyond the end of the section header string table (%d)!\n",
--             pszLogName, iShdr, pShdr->sh_name, pModElf->cbShStr)); NOREF(pszLogName);
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Shdr #%d: sh_name (%d) is beyond the end of the section header string table (%d)!",
-+                                   pszLogName, iShdr, pShdr->sh_name, pModElf->cbShStr);
- 
-     if (pShdr->sh_link >= pModElf->Ehdr.e_shnum)
--    {
--        Log(("RTLdrELF: %s: Shdr #%d: sh_link (%d) is beyond the end of the section table (%d)!\n",
--             pszLogName, iShdr, pShdr->sh_link, pModElf->Ehdr.e_shnum)); NOREF(pszLogName);
--        return VERR_BAD_EXE_FORMAT;
--    }
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: Shdr #%d: sh_link (%d) is beyond the end of the section table (%d)!",
-+                                   pszLogName, iShdr, pShdr->sh_link, pModElf->Ehdr.e_shnum);
- 
-     switch (pShdr->sh_type)
-     {
-         /** @todo find specs and check up which sh_info fields indicates section table entries */
-         case 12301230:
-             if (pShdr->sh_info >= pModElf->Ehdr.e_shnum)
--            {
--                Log(("RTLdrELF: %s: Shdr #%d: sh_info (%d) is beyond the end of the section table (%d)!\n",
--                     pszLogName, iShdr, pShdr->sh_link, pModElf->Ehdr.e_shnum));
--                return VERR_BAD_EXE_FORMAT;
--            }
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: Shdr #%d: sh_info (%d) is beyond the end of the section table (%d)!",
-+                                           pszLogName, iShdr, pShdr->sh_link, pModElf->Ehdr.e_shnum);
-             break;
- 
-         case SHT_NULL:
-@@ -1840,18 +2071,740 @@ static int RTLDRELF_NAME(ValidateSection
-         uint64_t offEnd = pShdr->sh_offset + pShdr->sh_size;
-         if (    offEnd > cbRawImage
-             ||  offEnd < (uint64_t)pShdr->sh_offset)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: Shdr #%d: sh_offset (" FMT_ELF_OFF ") + sh_size (" FMT_ELF_XWORD " = %RX64) is beyond the end of the file (%RX64)!",
-+                                       pszLogName, iShdr, pShdr->sh_offset, pShdr->sh_size, offEnd, cbRawImage);
-+        if (pShdr->sh_offset < sizeof(Elf_Ehdr))
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: Shdr #%d: sh_offset (" FMT_ELF_OFF ") + sh_size (" FMT_ELF_XWORD ") is starting in the ELF header!",
-+                                       pszLogName, iShdr, pShdr->sh_offset, pShdr->sh_size);
-+    }
-+
-+    return VINF_SUCCESS;
-+}
-+
-+
-+/**
-+ * Process the section headers.
-+ *
-+ * @returns iprt status code.
-+ * @param   pModElf     Pointer to the module structure.
-+ * @param   paShdrs     The section headers.
-+ * @param   cbRawImage  The size of the raw image.
-+ * @param   pszLogName  The log name.
-+ * @param   pErrInfo    Where to return extended error info. Optional.
-+ */
-+static int RTLDRELF_NAME(ValidateAndProcessSectionHeaders)(PRTLDRMODELF pModElf, Elf_Shdr *paShdrs, uint64_t cbRawImage,
-+                                                           const char *pszLogName, PRTERRINFO pErrInfo)
-+{
-+    Elf_Addr uNextAddr = 0;
-+    for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++)
-+    {
-+        int rc = RTLDRELF_NAME(ValidateSectionHeader)(pModElf, i, cbRawImage, pszLogName, pErrInfo);
-+        if (RT_FAILURE(rc))
-+            return rc;
-+
-+        /*
-+         * We're looking for symbol tables.
-+         */
-+        if (paShdrs[i].sh_type == SHT_SYMTAB)
-         {
--            Log(("RTLdrELF: %s: Shdr #%d: sh_offset (" FMT_ELF_OFF ") + sh_size (" FMT_ELF_XWORD " = %RX64) is beyond the end of the file (%RX64)!\n",
--                 pszLogName, iShdr, pShdr->sh_offset, pShdr->sh_size, offEnd, cbRawImage));
--            return VERR_BAD_EXE_FORMAT;
-+            if (pModElf->Rel.iSymSh != ~0U)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_MULTIPLE_SYMTABS,
-+                                           "%s: Multiple symbol tabs! iSymSh=%d i=%d", pszLogName, pModElf->Rel.iSymSh, i);
-+            pModElf->Rel.iSymSh = i;
-+            pModElf->Rel.cSyms  = (unsigned)(paShdrs[i].sh_size / sizeof(Elf_Sym));
-+            AssertBreakStmt(pModElf->Rel.cSyms == paShdrs[i].sh_size / sizeof(Elf_Sym), rc = VERR_IMAGE_TOO_BIG);
-+            pModElf->Rel.iStrSh = paShdrs[i].sh_link;
-+            pModElf->Rel.cbStr  = (unsigned)paShdrs[pModElf->Rel.iStrSh].sh_size;
-+            AssertBreakStmt(pModElf->Rel.cbStr == paShdrs[pModElf->Rel.iStrSh].sh_size, rc = VERR_IMAGE_TOO_BIG);
-+        }
-+        else if (paShdrs[i].sh_type == SHT_DYNSYM)
-+        {
-+            if (pModElf->Dyn.iSymSh != ~0U)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_LDRELF_MULTIPLE_SYMTABS,
-+                                           "%s: Multiple dynamic symbol tabs! iSymSh=%d i=%d", pszLogName, pModElf->Dyn.iSymSh, i);
-+            if (pModElf->Ehdr.e_type != ET_DYN && pModElf->Ehdr.e_type != ET_EXEC)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: Unexpected SHT_DYNSYM (i=%d) for e_type=%d", pszLogName, i, pModElf->Ehdr.e_type);
-+            pModElf->Dyn.iSymSh = i;
-+            pModElf->Dyn.cSyms  = (unsigned)(paShdrs[i].sh_size / sizeof(Elf_Sym));
-+            AssertBreakStmt(pModElf->Dyn.cSyms == paShdrs[i].sh_size / sizeof(Elf_Sym), rc = VERR_IMAGE_TOO_BIG);
-+            pModElf->Dyn.iStrSh = paShdrs[i].sh_link;
-+            pModElf->Dyn.cbStr  = (unsigned)paShdrs[pModElf->Dyn.iStrSh].sh_size;
-+            AssertBreakStmt(pModElf->Dyn.cbStr == paShdrs[pModElf->Dyn.iStrSh].sh_size, rc = VERR_IMAGE_TOO_BIG);
-         }
--        if (pShdr->sh_offset < sizeof(Elf_Ehdr))
-+        /*
-+         * We're also look for the dynamic section.
-+         */
-+        else if (paShdrs[i].sh_type == SHT_DYNAMIC)
-+        {
-+            if (pModElf->iShDynamic != ~0U)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: Multiple dynamic sections! iShDynamic=%d i=%d",
-+                                           pszLogName, pModElf->iShDynamic, i);
-+            if (pModElf->Ehdr.e_type != ET_DYN && pModElf->Ehdr.e_type != ET_EXEC)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: Unexpected SHT_DYNAMIC (i=%d) for e_type=%d", pszLogName, i, pModElf->Ehdr.e_type);
-+            if (paShdrs[i].sh_entsize != sizeof(Elf_Dyn))
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: SHT_DYNAMIC (i=%d) sh_entsize=" FMT_ELF_XWORD ",  expected %#zx",
-+                                           pszLogName, i, paShdrs[i].sh_entsize, sizeof(Elf_Dyn));
-+            pModElf->iShDynamic = i;
-+            Elf_Xword const cDynamic = paShdrs[i].sh_size / sizeof(Elf_Dyn);
-+            if (cDynamic > _64K || cDynamic < 2)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: SHT_DYNAMIC (i=%d) sh_size=" FMT_ELF_XWORD " is out of range (2..64K)",
-+                                           pszLogName, i, paShdrs[i].sh_size);
-+            pModElf->cDynamic = (unsigned)cDynamic;
-+        }
-+
-+        /*
-+         * Special checks for the section string table.
-+         */
-+        if (i == pModElf->Ehdr.e_shstrndx)
-         {
--            Log(("RTLdrELF: %s: Shdr #%d: sh_offset (" FMT_ELF_OFF ") + sh_size (" FMT_ELF_XWORD ") is starting in the ELF header!\n",
--                 pszLogName, iShdr, pShdr->sh_offset, pShdr->sh_size));
--            return VERR_BAD_EXE_FORMAT;
-+            if (paShdrs[i].sh_type != SHT_STRTAB)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: Section header string table is not a SHT_STRTAB: %#x",
-+                                           pszLogName, paShdrs[i].sh_type);
-+            if (paShdrs[i].sh_size == 0)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Section header string table is empty", pszLogName);
-         }
-+
-+        /*
-+         * Kluge for the .data..percpu segment in 64-bit linux kernels.
-+         */
-+        if (paShdrs[i].sh_flags & SHF_ALLOC)
-+        {
-+            if (   paShdrs[i].sh_addr == 0
-+                && paShdrs[i].sh_addr < uNextAddr)
-+            {
-+                Elf_Addr uAddr = RT_ALIGN_T(uNextAddr, paShdrs[i].sh_addralign, Elf_Addr);
-+                Log(("RTLdrElf: Out of order section #%d; adjusting sh_addr from " FMT_ELF_ADDR " to " FMT_ELF_ADDR "\n",
-+                     i, paShdrs[i].sh_addr, uAddr));
-+                paShdrs[i].sh_addr = uAddr;
-+            }
-+            uNextAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size;
-+        }
-+    } /* for each section header */
-+
-+    return VINF_SUCCESS;
-+}
-+
-+
-+/**
-+ * Process the section headers.
-+ *
-+ * @returns iprt status code.
-+ * @param   pModElf     Pointer to the module structure.
-+ * @param   paShdrs     The section headers.
-+ * @param   cbRawImage  The size of the raw image.
-+ * @param   pszLogName  The log name.
-+ * @param   pErrInfo    Where to return extended error info. Optional.
-+ */
-+static int RTLDRELF_NAME(ValidateAndProcessDynamicInfo)(PRTLDRMODELF pModElf, uint64_t cbRawImage, uint32_t fFlags,
-+                                                        const char *pszLogName, PRTERRINFO pErrInfo)
-+{
-+    /*
-+     * Check preconditions.
-+     */
-+    AssertReturn(pModElf->Ehdr.e_type == ET_DYN || pModElf->Ehdr.e_type == ET_EXEC, VERR_INTERNAL_ERROR_2);
-+    if (pModElf->Ehdr.e_phnum <= 1 || pModElf->Ehdr.e_phnum >= _32K)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                   "%s: e_phnum=%u is out of bounds (2..32K)", pszLogName, pModElf->Ehdr.e_phnum);
-+    if (pModElf->iShDynamic == ~0U)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: no .dynamic section", pszLogName);
-+    AssertReturn(pModElf->cDynamic > 1 && pModElf->cDynamic <= _64K, VERR_INTERNAL_ERROR_3);
-+
-+    /* ASSUME that the sections are ordered by address.  That simplifies
-+       validation code further down. */
-+    AssertReturn(pModElf->Ehdr.e_shnum >= 2, VERR_INTERNAL_ERROR_4);
-+    Elf_Shdr const *paShdrs  = pModElf->paShdrs;
-+    Elf_Addr        uPrevEnd = paShdrs[1].sh_addr + paShdrs[1].sh_size;
-+    for (unsigned i = 2; i < pModElf->Ehdr.e_shnum; i++)
-+        if (paShdrs[i].sh_flags & SHF_ALLOC)
-+        {
-+            if (uPrevEnd > paShdrs[i].sh_addr)
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                           "%s: section %u is out of order: uPrevEnd=" FMT_ELF_ADDR " sh_addr=" FMT_ELF_ADDR,
-+                                           pszLogName, i, uPrevEnd, paShdrs[i].sh_addr);
-+            uPrevEnd = paShdrs[i].sh_addr + paShdrs[i].sh_size;
-+        }
-+
-+    /* Must have string and symbol tables. */
-+    if (pModElf->Dyn.iStrSh == ~0U)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: No dynamic string table section", pszLogName);
-+    if (pModElf->Dyn.iSymSh == ~0U)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: No dynamic symbol table section", pszLogName);
-+
-+    /*
-+     * Load the program headers.
-+     */
-+    size_t const cbPhdrs = sizeof(pModElf->paPhdrs[0]) * pModElf->Ehdr.e_phnum;
-+    Elf_Phdr    *paPhdrs = (Elf_Phdr *)RTMemAllocZ(cbPhdrs);
-+    pModElf->paPhdrs = paPhdrs;
-+    AssertReturn(paPhdrs, VERR_NO_MEMORY);
-+
-+    int rc = pModElf->Core.pReader->pfnRead(pModElf->Core.pReader, paPhdrs, cbPhdrs, pModElf->Ehdr.e_phoff);
-+    if (RT_FAILURE(rc))
-+        return RTERRINFO_LOG_SET_F(pErrInfo, rc, "%s: pfnRead(,,%#zx, " FMT_ELF_OFF ") -> %Rrc",
-+                                   pszLogName, cbPhdrs, pModElf->Ehdr.e_phoff, rc);
-+
-+    /*
-+     * Validate them.
-+     */
-+    unsigned cbPage = _4K; /** @todo generalize architecture specific stuff using its own code template header.  */
-+    switch (pModElf->Core.enmArch)
-+    {
-+        case RTLDRARCH_AMD64:
-+        case RTLDRARCH_X86_32:
-+            break;
-+        default:
-+            AssertFailedBreak(/** @todo page size for got.plt hacks */);
-     }
-+    unsigned iLoad          = 0;
-+    unsigned iLoadShdr      = 1; /* ASSUMES ordered (checked above). */
-+    unsigned cDynamic       = 0;
-+    Elf_Addr cbImage        = 0;
-+    Elf_Addr uLinkAddress   = ~(Elf_Addr)0;
-+    for (unsigned i = 0; i < pModElf->Ehdr.e_phnum; i++)
-+    {
-+        const Elf_Phdr * const pPhdr = &paPhdrs[i];
-+        Log3(("RTLdrELF: Program Header #%d:\n"
-+              "RTLdrELF:   p_type: " FMT_ELF_WORD " (%s)\n"
-+              "RTLdrELF:  p_flags: " FMT_ELF_WORD "\n"
-+              "RTLdrELF: p_offset: " FMT_ELF_OFF "\n"
-+              "RTLdrELF:  p_vaddr: " FMT_ELF_ADDR "\n"
-+              "RTLdrELF:  p_paddr: " FMT_ELF_ADDR "\n"
-+              "RTLdrELF: p_filesz: " FMT_ELF_XWORD "\n"
-+              "RTLdrELF:  p_memsz: " FMT_ELF_XWORD "\n"
-+              "RTLdrELF:  p_align: " FMT_ELF_XWORD "\n",
-+              i,
-+              pPhdr->p_type, rtldrElfGetPhdrType(pPhdr->p_type), pPhdr->p_flags, pPhdr->p_offset,
-+              pPhdr->p_vaddr, pPhdr->p_paddr, pPhdr->p_filesz, pPhdr->p_memsz, pPhdr->p_align));
-+
-+        if (pPhdr->p_type == DT_NULL)
-+            continue;
-+
-+        if (   pPhdr->p_filesz != 0
-+            && (   pPhdr->p_offset >= cbRawImage
-+                || pPhdr->p_filesz > cbRawImage
-+                || pPhdr->p_offset + pPhdr->p_filesz > cbRawImage))
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: Prog Hdr #%u: bogus p_offset=" FMT_ELF_OFF " & p_filesz=" FMT_ELF_XWORD " (file size %#RX64)",
-+                                       pszLogName, i, pPhdr->p_offset, pPhdr->p_filesz, cbRawImage);
-+
-+        if (pPhdr->p_flags & ~(Elf64_Word)(PF_X | PF_R | PF_W))
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Prog Hdr #%u: bogus p_flags=" FMT_ELF_WORD,
-+                                       pszLogName, i, pPhdr->p_flags);
-+
-+        if (!RT_IS_POWER_OF_TWO(pPhdr->p_align))
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Prog Hdr #%u: bogus p_align=" FMT_ELF_XWORD,
-+                                       pszLogName, i, pPhdr->p_align);
-+
-+        if (   pPhdr->p_align  > 1
-+            && pPhdr->p_memsz  > 0
-+            && pPhdr->p_filesz > 0
-+            && (pPhdr->p_offset & (pPhdr->p_align - 1)) != (pPhdr->p_vaddr & (pPhdr->p_align - 1)))
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: Prog Hdr #%u: misaligned p_offset=" FMT_ELF_OFF " p_vaddr=" FMT_ELF_ADDR " p_align=" FMT_ELF_XWORD,
-+                                       pszLogName, i, pPhdr->p_offset, pPhdr->p_vaddr, pPhdr->p_align);
-+
-+        /* Do some type specfic checks: */
-+        switch (pPhdr->p_type)
-+        {
-+            case PT_LOAD:
-+            {
-+                if (pPhdr->p_memsz < pPhdr->p_filesz)
-+                    return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                               "%s: Prog Hdr #%u/LOAD#%u: bogus p_memsz=" FMT_ELF_XWORD " or p_filesz=" FMT_ELF_XWORD,
-+                                               pszLogName, i, iLoad, pPhdr->p_memsz, pPhdr->p_filesz);
-+                cbImage = pPhdr->p_vaddr + pPhdr->p_memsz;
-+                if (iLoad == 0)
-+                    uLinkAddress = pPhdr->p_vaddr;
-+
-+                /* Find the corresponding sections, checking their addresses and
-+                   file offsets since the rest of the code is still section based
-+                   rather than using program headers as it should... */
-+                Elf_Off         off     = pPhdr->p_offset;
-+                Elf_Addr        uAddr   = pPhdr->p_vaddr;
-+                Elf_Xword       cbMem   = pPhdr->p_memsz;
-+                Elf_Xword       cbFile  = pPhdr->p_filesz;
-+                while (cbMem > 0)
-+                {
-+                    if (iLoadShdr < pModElf->Ehdr.e_shnum)
-+                    { /* likely */ }
-+                    else if (iLoadShdr == pModElf->Ehdr.e_shnum)
-+                    {
-+                        /** @todo anything else to check here? */
-+                        iLoadShdr++;
-+                        break;
-+                    }
-+                    else
-+                        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                                   "%s: Prog Hdr #%u/LOAD#%u: Out of sections at " FMT_ELF_ADDR " LB " FMT_ELF_XWORD,
-+                                                   pszLogName, i, iLoad, uAddr, cbMem);
-+                    if (!(paShdrs[iLoadShdr].sh_flags & SHF_ALLOC))
-+                    {
-+                        if (   paShdrs[iLoadShdr].sh_type != SHT_NOBITS
-+                            && paShdrs[iLoadShdr].sh_size > 0
-+                            && off < paShdrs[iLoadShdr].sh_offset + paShdrs[iLoadShdr].sh_size
-+                            && paShdrs[iLoadShdr].sh_offset < off + cbMem)
-+                            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                                       "%s: Prog Hdr #%u/LOAD#%u: Overlaps with !SHF_ALLOC section at " FMT_ELF_OFF " LB " FMT_ELF_XWORD,
-+                                                       pszLogName, i, iLoad, paShdrs[iLoadShdr].sh_offset, paShdrs[iLoadShdr].sh_size);
-+                        pModElf->paShdrExtras[iLoadShdr].idxPhdr = UINT16_MAX;
-+                        iLoadShdr++;
-+                        continue;
-+                    }
-+
-+                    if (uAddr != paShdrs[iLoadShdr].sh_addr)
-+                    {
-+                        /* Before the first section we expect headers to be loaded, so
-+                           that the file is simply mapped from file offset zero. */
-+                        if (   iLoadShdr == 1
-+                            && iLoad     == 0
-+                            && paShdrs[1].sh_addr == paShdrs[1].sh_offset
-+                            && cbFile    >= paShdrs[1].sh_offset
-+                            && cbMem     >= paShdrs[1].sh_offset)
-+                        {
-+                            /* Modify paShdrs[0] to describe the gap. ".elf.headers" */
-+                            pModElf->iFirstSect              = 0;
-+                            pModElf->paShdrs[0].sh_name      = 0;
-+                            pModElf->paShdrs[0].sh_type      = SHT_PROGBITS;
-+                            pModElf->paShdrs[0].sh_flags     = SHF_ALLOC
-+                                                             | (pPhdr->p_flags & PF_W ? SHF_WRITE     : 0)
-+                                                             | (pPhdr->p_flags & PF_X ? SHF_EXECINSTR : 0);
-+                            pModElf->paShdrs[0].sh_addr      = uAddr;
-+                            pModElf->paShdrs[0].sh_offset    = off;
-+                            pModElf->paShdrs[0].sh_size      = paShdrs[1].sh_offset;
-+                            pModElf->paShdrs[0].sh_link      = 0;
-+                            pModElf->paShdrs[0].sh_info      = 0;
-+                            pModElf->paShdrs[0].sh_addralign = pPhdr->p_align;
-+                            pModElf->paShdrs[0].sh_entsize   = 0;
-+                            *(Elf_Shdr *)pModElf->paOrgShdrs = pModElf->paShdrs[0]; /* (necessary for segment enumeration) */
-+
-+                            uAddr  += paShdrs[1].sh_offset;
-+                            cbMem  -= paShdrs[1].sh_offset;
-+                            cbFile -= paShdrs[1].sh_offset;
-+                            off     = paShdrs[1].sh_offset;
-+                        }
-+                        /* Alignment padding?  Allow up to a page size. */
-+                        else if (   paShdrs[iLoadShdr].sh_addr > uAddr
-+                                 &&   paShdrs[iLoadShdr].sh_addr - uAddr
-+                                    < RT_MAX(paShdrs[iLoadShdr].sh_addralign, cbPage /*got.plt hack*/))
-+                        {
-+                            Elf_Xword cbAlignPadding = paShdrs[iLoadShdr].sh_addr - uAddr;
-+                            if (cbAlignPadding >= cbMem)
-+                                break;
-+                            cbMem -= cbAlignPadding;
-+                            uAddr += cbAlignPadding;
-+                            if (cbFile > cbAlignPadding)
-+                            {
-+                                off    += cbAlignPadding;
-+                                cbFile -= cbAlignPadding;
-+                            }
-+                            else
-+                            {
-+                                off   += cbFile;
-+                                cbFile = 0;
-+                            }
-+                        }
-+                    }
-+
-+                    if (   uAddr == paShdrs[iLoadShdr].sh_addr
-+                        && cbMem >= paShdrs[iLoadShdr].sh_size
-+                        && (  paShdrs[iLoadShdr].sh_type != SHT_NOBITS
-+                            ?    off    == paShdrs[iLoadShdr].sh_offset
-+                              && cbFile >= paShdrs[iLoadShdr].sh_size /* this might be too strict... */
-+                            : cbFile == 0) )
-+                    {
-+                        if (paShdrs[iLoadShdr].sh_type != SHT_NOBITS)
-+                        {
-+                            off    += paShdrs[iLoadShdr].sh_size;
-+                            cbFile -= paShdrs[iLoadShdr].sh_size;
-+                        }
-+                        uAddr += paShdrs[iLoadShdr].sh_size;
-+                        cbMem -= paShdrs[iLoadShdr].sh_size;
-+                    }
-+                    else
-+                        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                                   "%s: Prog Hdr #%u/LOAD#%u: Mismatch at " FMT_ELF_ADDR " LB " FMT_ELF_XWORD " (file " FMT_ELF_OFF " LB " FMT_ELF_XWORD ") with section #%u " FMT_ELF_ADDR " LB " FMT_ELF_XWORD " (file " FMT_ELF_OFF " sh_type=" FMT_ELF_WORD ")",
-+                                                   pszLogName, i, iLoad, uAddr, cbMem, off, cbFile,
-+                                                   iLoadShdr, paShdrs[iLoadShdr].sh_addr, paShdrs[iLoadShdr].sh_size,
-+                                                   paShdrs[iLoadShdr].sh_offset, paShdrs[iLoadShdr].sh_type);
-+
-+                    pModElf->paShdrExtras[iLoadShdr].idxPhdr = iLoad;
-+                    iLoadShdr++;
-+                } /* section loop */
-+
-+                iLoad++;
-+                break;
-+            }
-+
-+            case PT_DYNAMIC:
-+            {
-+                const Elf_Shdr *pShdr = &pModElf->paShdrs[pModElf->iShDynamic];
-+                if (pPhdr->p_offset != pShdr->sh_offset)
-+                    return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                               "%s: Prog Hdr #%u/DYNAMIC: p_offset=" FMT_ELF_OFF " expected " FMT_ELF_OFF,
-+                                               pszLogName, i, pPhdr->p_offset, pShdr->sh_offset);
-+                if (RT_MAX(pPhdr->p_memsz, pPhdr->p_filesz) != pShdr->sh_size)
-+                    return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                               "%s: Prog Hdr #%u/DYNAMIC: expected " FMT_ELF_XWORD " for RT_MAX(p_memsz=" FMT_ELF_XWORD ", p_filesz=" FMT_ELF_XWORD ")",
-+                                               pszLogName, i, pShdr->sh_size, pPhdr->p_memsz, pPhdr->p_filesz);
-+                cDynamic++;
-+                break;
-+            }
-+        }
-+    }
-+
-+    if (iLoad == 0)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, rc, "%s: No PT_LOAD program headers", pszLogName);
-+    if (cDynamic != 1)
-+        return RTERRINFO_LOG_SET_F(pErrInfo, rc, "%s: No program header for the DYNAMIC section", pszLogName);
-+
-+    cbImage -= uLinkAddress;
-+    pModElf->cbImage     = (uint64_t)cbImage;
-+    pModElf->LinkAddress = uLinkAddress;
-+    AssertReturn(pModElf->cbImage == cbImage, VERR_INTERNAL_ERROR_5);
-+    Log3(("RTLdrELF: LinkAddress=" FMT_ELF_ADDR " cbImage=" FMT_ELF_ADDR " (from PT_LOAD)\n", uLinkAddress, cbImage));
-+
-+    for (; iLoadShdr < pModElf->Ehdr.e_shnum; iLoadShdr++)
-+        if (   !(paShdrs[iLoadShdr].sh_flags & SHF_ALLOC)
-+            || paShdrs[iLoadShdr].sh_size == 0)
-+            pModElf->paShdrExtras[iLoadShdr].idxPhdr = UINT16_MAX;
-+        else
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: No PT_LOAD for section #%u " FMT_ELF_ADDR " LB " FMT_ELF_XWORD " (file " FMT_ELF_OFF " sh_type=" FMT_ELF_WORD ")",
-+                                       pszLogName, iLoadShdr, paShdrs[iLoadShdr].sh_addr, paShdrs[iLoadShdr].sh_size,
-+                                       paShdrs[iLoadShdr].sh_offset, paShdrs[iLoadShdr].sh_type);
-+
-+    /*
-+     * Load and validate the dynamic table.  We have got / will get most of the
-+     * info we need from the section table, so we must make sure this matches up.
-+     */
-+    Log3(("RTLdrELF: Dynamic section - %u entries\n", pModElf->cDynamic));
-+    size_t const    cbDynamic = pModElf->cDynamic * sizeof(pModElf->paDynamic[0]);
-+    Elf_Dyn * const paDynamic = (Elf_Dyn *)RTMemAlloc(cbDynamic);
-+    AssertReturn(paDynamic, VERR_NO_MEMORY);
-+    pModElf->paDynamic = paDynamic;
-+
-+    rc = pModElf->Core.pReader->pfnRead(pModElf->Core.pReader, paDynamic, cbDynamic, paShdrs[pModElf->iShDynamic].sh_offset);
-+    if (RT_FAILURE(rc))
-+        return RTERRINFO_LOG_SET_F(pErrInfo, rc, "%s: pfnRead(,,%#zx, " FMT_ELF_OFF ") -> %Rrc",
-+                                   pszLogName, cbDynamic, paShdrs[pModElf->iShDynamic].sh_offset, rc);
-+
-+    for (uint32_t i = 0; i < pModElf->cDynamic; i++)
-+    {
-+#define LOG_VALIDATE_PTR_RET(szName) do { \
-+            Log3(("RTLdrELF: DT[%u]: %16s " FMT_ELF_ADDR "\n", i, szName, paDynamic[i].d_un.d_ptr)); \
-+            if ((uint64_t)paDynamic[i].d_un.d_ptr - uLinkAddress < cbImage) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" szName ": Invalid address " FMT_ELF_ADDR " (valid range: " FMT_ELF_ADDR " LB " FMT_ELF_ADDR ")", \
-+                                            pszLogName, i, paDynamic[i].d_un.d_ptr, uLinkAddress, cbImage); \
-+        } while (0)
-+#define LOG_VALIDATE_PTR_VAL_RET(szName, uExpected) do { \
-+            Log3(("RTLdrELF: DT[%u]: %16s " FMT_ELF_ADDR "\n", i, szName, (uint64_t)paDynamic[i].d_un.d_ptr)); \
-+            if (paDynamic[i].d_un.d_ptr == (Elf_Addr)(uExpected)) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" szName ": " FMT_ELF_ADDR ", expected " FMT_ELF_ADDR, \
-+                                            pszLogName, i, paDynamic[i].d_un.d_ptr, (Elf_Addr)(uExpected)); \
-+        } while (0)
-+#define LOG_VALIDATE_STR_RET(szName) do { \
-+            Log3(("RTLdrELF: DT[%u]: %16s %#RX64\n", i, szName, (uint64_t)paDynamic[i].d_un.d_val)); \
-+            if ((uint64_t)paDynamic[i].d_un.d_val < pModElf->Dyn.cbStr) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" szName ": Invalid string table offset %#RX64 (max %#x)", \
-+                                            pszLogName, i, (uint64_t)paDynamic[i].d_un.d_val, pModElf->Dyn.cbStr); \
-+        } while (0)
-+#define LOG_VALIDATE_VAL_RET(szName, uExpected) do { \
-+            Log3(("RTLdrELF: DT[%u]: %16s %#RX64\n", i, szName, (uint64_t)paDynamic[i].d_un.d_val)); \
-+            if ((uint64_t)paDynamic[i].d_un.d_val == (uint64_t)(uExpected)) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" szName ": %#RX64, expected %#RX64", \
-+                                            pszLogName, i, (uint64_t)paDynamic[i].d_un.d_val, (uint64_t)(uExpected)); \
-+        } while (0)
-+#define SET_RELOC_TYPE_RET(a_szName, a_uType) do { \
-+            if (pModElf->DynInfo.uRelocType == 0 || pModElf->DynInfo.uRelocType == (a_uType)) \
-+                pModElf->DynInfo.uRelocType = (a_uType); \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" a_szName ": Mixing DT_RELA and DT_REL", pszLogName, i); \
-+        } while (0)
-+#define SET_INFO_FIELD_RET(a_szName, a_Field, a_Value, a_UnsetValue, a_szFmt) do { \
-+            if ((a_Field) == (a_UnsetValue) && (a_Value) != (a_UnsetValue)) \
-+                (a_Field) = (a_Value); /* likely */ \
-+            else if ((a_Field) != (a_UnsetValue)) \
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" a_szName ": Multiple entries (first value " a_szFmt ", second " a_szFmt ")", pszLogName, i, (a_Field), (a_Value)); \
-+            else if ((a_Value) != (a_UnsetValue)) \
-+                return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" a_szName ": Unexpected value " a_szFmt, pszLogName, i, (a_Value)); \
-+        } while (0)
-+#define FIND_MATCHING_SECTION_RET(a_szName, a_ExtraMatchExpr, a_idxShFieldToSet) do { \
-+            unsigned iSh; \
-+            for (iSh = 1; iSh < pModElf->Ehdr.e_shnum; iSh++) \
-+                if (   paShdrs[iSh].sh_addr == paDynamic[i].d_un.d_ptr \
-+                    && (a_ExtraMatchExpr)) \
-+                { \
-+                    (a_idxShFieldToSet) = iSh; \
-+                    if (pModElf->paShdrExtras[iSh].idxDt != UINT16_MAX) \
-+                        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, \
-+                                                   "%s: DT[%u]/" a_szName ": section #%u (" FMT_ELF_ADDR ") already referenced by DT[%u]", \
-+                                                   pszLogName, i, iSh, paShdrs[iSh].sh_addr, pModElf->paShdrExtras[iSh].idxDt); \
-+                    pModElf->paShdrExtras[iSh].idxDt  = i; \
-+                    pModElf->paShdrExtras[iSh].uDtTag = (uint32_t)paDynamic[i].d_tag; \
-+                    break; \
-+                } \
-+            if (iSh < pModElf->Ehdr.e_shnum) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" a_szName ": No matching section for " FMT_ELF_ADDR, pszLogName, i, paDynamic[i].d_un.d_ptr); \
-+        } while (0)
-+#define ONLY_FOR_DEBUG_OR_VALIDATION_RET(a_szName) do { \
-+            if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)) { /* likely */ } \
-+            else return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/" a_szName ": Not supported (" FMT_ELF_ADDR ")", pszLogName, i, paDynamic[i].d_un.d_ptr); \
-+        } while (0)
-+#define LOG_NON_VALUE_ENTRY(a_szName) Log3(("RTLdrELF: DT[%u]: %16s (%#RX64)\n", i, a_szName, (uint64_t)paDynamic[i].d_un.d_val))
-+
-+        switch (paDynamic[i].d_tag)
-+        {
-+            case DT_NULL:
-+                LOG_NON_VALUE_ENTRY("DT_NULL");
-+                for (unsigned iNull = i + 1; iNull < pModElf->cDynamic; iNull++)
-+                    if (paDynamic[i].d_tag == DT_NULL) /* Not technically a bug, but let's try being extremely strict for now */
-+                        LOG_NON_VALUE_ENTRY("DT_NULL");
-+                    else if (!(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
-+                        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                                   "%s: DT[%u]/DT_NULL: Dynamic section isn't zero padded (extra #%u of #%u)",
-+                                                   pszLogName, i, iNull - i, pModElf->cDynamic - i);
-+                i = pModElf->cDynamic;
-+                break;
-+            case DT_NEEDED:
-+                LOG_VALIDATE_STR_RET("DT_NEEDED");
-+                break;
-+            case DT_PLTRELSZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_PLTRELSZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                SET_INFO_FIELD_RET("DT_PLTRELSZ", pModElf->DynInfo.cbJmpRelocs, (Elf_Xword)paDynamic[i].d_un.d_val, 0, FMT_ELF_XWORD);
-+                break;
-+            case DT_PLTGOT:
-+                LOG_VALIDATE_PTR_RET("DT_PLTGOT");
-+                break;
-+            case DT_HASH:
-+                LOG_VALIDATE_PTR_RET("DT_HASH");
-+                break;
-+            case DT_STRTAB:
-+                LOG_VALIDATE_PTR_VAL_RET("DT_STRTAB", paShdrs[pModElf->Dyn.iStrSh].sh_addr);
-+                pModElf->paShdrExtras[pModElf->Dyn.iStrSh].idxDt  = i;
-+                pModElf->paShdrExtras[pModElf->Dyn.iSymSh].uDtTag = DT_STRTAB;
-+                break;
-+            case DT_SYMTAB:
-+                LOG_VALIDATE_PTR_VAL_RET("DT_SYMTAB", paShdrs[pModElf->Dyn.iSymSh].sh_addr);
-+                pModElf->paShdrExtras[pModElf->Dyn.iSymSh].idxDt  = i;
-+                pModElf->paShdrExtras[pModElf->Dyn.iSymSh].uDtTag = DT_SYMTAB;
-+                break;
-+            case DT_RELA:
-+                LOG_VALIDATE_PTR_RET("DT_RELA");
-+                SET_RELOC_TYPE_RET("DT_RELA", DT_RELA);
-+                SET_INFO_FIELD_RET("DT_RELA", pModElf->DynInfo.uPtrRelocs, paDynamic[i].d_un.d_ptr, ~(Elf_Addr)0, FMT_ELF_ADDR);
-+                FIND_MATCHING_SECTION_RET("DT_RELA", paShdrs[iSh].sh_type == SHT_RELA, pModElf->DynInfo.idxShRelocs);
-+                break;
-+            case DT_RELASZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_RELASZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                SET_RELOC_TYPE_RET("DT_RELASZ", DT_RELA);
-+                SET_INFO_FIELD_RET("DT_RELASZ", pModElf->DynInfo.cbRelocs, (Elf_Xword)paDynamic[i].d_un.d_val, 0, FMT_ELF_XWORD);
-+                break;
-+            case DT_RELAENT:
-+                LOG_VALIDATE_VAL_RET("DT_RELAENT", sizeof(Elf_Rela));
-+                SET_RELOC_TYPE_RET("DT_RELAENT", DT_RELA);
-+                SET_INFO_FIELD_RET("DT_RELAENT", pModElf->DynInfo.cbRelocEntry, (unsigned)sizeof(Elf_Rela), 0, "%u");
-+                break;
-+            case DT_STRSZ:
-+                LOG_VALIDATE_VAL_RET("DT_STRSZ", pModElf->Dyn.cbStr);
-+                break;
-+            case DT_SYMENT:
-+                LOG_VALIDATE_VAL_RET("DT_SYMENT", sizeof(Elf_Sym));
-+                break;
-+            case DT_INIT:
-+                LOG_VALIDATE_PTR_RET("DT_INIT");
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_INIT");
-+                break;
-+            case DT_FINI:
-+                LOG_VALIDATE_PTR_RET("DT_FINI");
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_FINI");
-+                break;
-+            case DT_SONAME:
-+                LOG_VALIDATE_STR_RET("DT_SONAME");
-+                break;
-+            case DT_RPATH:
-+                LOG_VALIDATE_STR_RET("DT_RPATH");
-+                break;
-+            case DT_SYMBOLIC:
-+                LOG_NON_VALUE_ENTRY("DT_SYMBOLIC");
-+                break;
-+            case DT_REL:
-+                LOG_VALIDATE_PTR_RET("DT_REL");
-+                SET_RELOC_TYPE_RET("DT_REL", DT_REL);
-+                SET_INFO_FIELD_RET("DT_REL", pModElf->DynInfo.uPtrRelocs, paDynamic[i].d_un.d_ptr, ~(Elf_Addr)0, FMT_ELF_ADDR);
-+                FIND_MATCHING_SECTION_RET("DT_REL", paShdrs[iSh].sh_type == SHT_REL, pModElf->DynInfo.idxShRelocs);
-+                break;
-+            case DT_RELSZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_RELSZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                SET_RELOC_TYPE_RET("DT_RELSZ", DT_REL);
-+                SET_INFO_FIELD_RET("DT_RELSZ", pModElf->DynInfo.cbRelocs, (Elf_Xword)paDynamic[i].d_un.d_val, 0, FMT_ELF_XWORD);
-+                break;
-+            case DT_RELENT:
-+                LOG_VALIDATE_VAL_RET("DT_RELENT", sizeof(Elf_Rel));
-+                SET_RELOC_TYPE_RET("DT_RELENT", DT_REL);
-+                SET_INFO_FIELD_RET("DT_RELENT", pModElf->DynInfo.cbRelocEntry, (unsigned)sizeof(Elf_Rel), 0, "%u");
-+                break;
-+            case DT_PLTREL:
-+                if (paDynamic[i].d_un.d_val != DT_RELA && paDynamic[i].d_un.d_val != DT_REL)
-+                    return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT[%u]/DT_PLTREL: Invalid value %#RX64",
-+                                               pszLogName, i, (uint64_t)paDynamic[i].d_un.d_val);
-+                Log3(("RTLdrELF: DT[%u]: %16s DT_REL%s\n", i, "DT_PLTREL", paDynamic[i].d_un.d_val == DT_RELA ? "A" : ""));
-+                SET_INFO_FIELD_RET("DT_PLTREL", pModElf->DynInfo.uJmpRelocType, (unsigned)paDynamic[i].d_un.d_val, 0, "%u");
-+                break;
-+            case DT_DEBUG:
-+                LOG_VALIDATE_PTR_RET("DT_DEBUG");
-+                break;
-+            case DT_TEXTREL:
-+                LOG_NON_VALUE_ENTRY("DT_TEXTREL");
-+                break;
-+            case DT_JMPREL:
-+                LOG_VALIDATE_PTR_RET("DT_JMPREL");
-+                SET_INFO_FIELD_RET("DT_JMPREL", pModElf->DynInfo.uPtrJmpRelocs, paDynamic[i].d_un.d_ptr, ~(Elf_Addr)0, FMT_ELF_ADDR);
-+                FIND_MATCHING_SECTION_RET("DT_JMPREL", 1, pModElf->DynInfo.idxShJmpRelocs);
-+                break;
-+            case DT_BIND_NOW:
-+                LOG_NON_VALUE_ENTRY("DT_BIND_NOW");
-+                break;
-+            case DT_INIT_ARRAY:
-+                LOG_VALIDATE_PTR_RET("DT_INIT_ARRAY");
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_INIT_ARRAY");
-+                break;
-+            case DT_FINI_ARRAY:
-+                LOG_VALIDATE_PTR_RET("DT_FINI_ARRAY");
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_FINI_ARRAY");
-+                break;
-+            case DT_INIT_ARRAYSZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_INIT_ARRAYSZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_INIT_ARRAYSZ");
-+                break;
-+            case DT_FINI_ARRAYSZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_FINI_ARRAYSZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_FINI_ARRAYSZ");
-+                break;
-+            case DT_RUNPATH:
-+                LOG_VALIDATE_STR_RET("DT_RUNPATH");
-+                break;
-+            case DT_FLAGS:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64\n", i, "DT_FLAGS", (uint64_t)paDynamic[i].d_un.d_val));
-+                break;
-+            case DT_PREINIT_ARRAY:
-+                LOG_VALIDATE_PTR_RET("DT_PREINIT_ARRAY");
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_PREINIT_ARRAY");
-+                break;
-+            case DT_PREINIT_ARRAYSZ:
-+                Log3(("RTLdrELF: DT[%u]: %16s %#RX64 bytes\n", i, "DT_PREINIT_ARRAYSZ", (uint64_t)paDynamic[i].d_un.d_val));
-+                ONLY_FOR_DEBUG_OR_VALIDATION_RET("DT_PREINIT_ARRAYSZ");
-+                break;
-+            default:
-+                if (   paDynamic[i].d_un.d_val < DT_ENCODING
-+                    || (paDynamic[i].d_un.d_val & 1))
-+                    Log3(("RTLdrELF: DT[%u]: %#010RX64       %#RX64%s\n", i, (uint64_t)paDynamic[i].d_tag,
-+                          (uint64_t)paDynamic[i].d_un.d_val, paDynamic[i].d_un.d_val >= DT_ENCODING ? " (val)" : ""));
-+                else
-+                {
-+                    Log3(("RTLdrELF: DT[%u]: %#010RX64       " FMT_ELF_ADDR " (addr)\n",
-+                          i, (uint64_t)paDynamic[i].d_tag, paDynamic[i].d_un.d_ptr));
-+                    if ((uint64_t)paDynamic[i].d_un.d_ptr - uLinkAddress >= cbImage)
-+                        return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                                   "%s: DT[%u]/%#RX64: Invalid address " FMT_ELF_ADDR " (valid range: " FMT_ELF_ADDR " LB " FMT_ELF_ADDR ")",
-+                                                   pszLogName, i, (uint64_t)paDynamic[i].d_tag,
-+                                                   paDynamic[i].d_un.d_ptr, uLinkAddress, cbImage);
-+                }
-+                break;
-+        }
-+#undef LOG_VALIDATE_VAL_RET
-+#undef LOG_VALIDATE_STR_RET
-+#undef LOG_VALIDATE_PTR_VAL_RET
-+#undef LOG_VALIDATE_PTR_RET
-+#undef SET_RELOC_TYPE_RET
-+#undef SET_INFO_FIELD_RET
-+#undef FIND_MATCHING_SECTION_RET
-+#undef ONLY_FOR_DEBUG_OR_VALIDATION_RET
-+    }
-+
-+    /*
-+     * Validate the relocation information we've gathered.
-+     */
-+    Elf_Word uShTypeArch = SHT_RELA; /** @todo generalize architecture specific stuff using its own code template header.  */
-+    switch (pModElf->Core.enmArch)
-+    {
-+        case RTLDRARCH_AMD64:
-+            break;
-+        case RTLDRARCH_X86_32:
-+            uShTypeArch = SHT_REL;
-+            break;
-+        default:
-+            AssertFailedBreak(/** @todo page size for got.plt hacks */);
-+
-+    }
-+
-+    if (pModElf->DynInfo.uRelocType != 0)
-+    {
-+        const char * const pszModifier = pModElf->DynInfo.uRelocType == DT_RELA ? "A" : "";
-+        if (pModElf->DynInfo.uPtrRelocs == ~(Elf_Addr)0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_REL%s", pszLogName, pszModifier);
-+        if (pModElf->DynInfo.cbRelocs == 0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_REL%sSZ", pszLogName, pszModifier);
-+        if (pModElf->DynInfo.cbRelocEntry == 0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_REL%sENT", pszLogName, pszModifier);
-+        Elf_Shdr const *pShdrRelocs = &paShdrs[pModElf->DynInfo.idxShRelocs];
-+        Elf_Word const  uShType     = pModElf->DynInfo.uJmpRelocType == DT_RELA ? SHT_RELA : SHT_REL;
-+        if (pShdrRelocs->sh_type != uShType)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_REL%s* does not match section type: %u vs %u",
-+                                       pszLogName, pszModifier, pShdrRelocs->sh_type, uShType);
-+        if (pShdrRelocs->sh_size != pModElf->DynInfo.cbRelocs)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_REL%sSZ does not match section size: %u vs %u",
-+                                       pszLogName, pszModifier, pShdrRelocs->sh_size, pModElf->DynInfo.cbRelocs);
-+        if (uShType != uShTypeArch)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_REL%s* does not match architecture: %u, arch wants %u",
-+                                       pszLogName, pszModifier, uShType, uShTypeArch);
-+    }
-+
-+    if (   pModElf->DynInfo.uPtrJmpRelocs != ~(Elf_Addr)0
-+        || pModElf->DynInfo.cbJmpRelocs   != 0
-+        || pModElf->DynInfo.uJmpRelocType != 0)
-+    {
-+        if (pModElf->DynInfo.uPtrJmpRelocs == ~(Elf_Addr)0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_JMPREL", pszLogName);
-+        if (pModElf->DynInfo.cbJmpRelocs == 0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_PLTRELSZ", pszLogName);
-+        if (pModElf->DynInfo.uJmpRelocType == 0)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: Missing DT_PLTREL", pszLogName);
-+        Elf_Shdr const *pShdrRelocs = &paShdrs[pModElf->DynInfo.idxShJmpRelocs];
-+        Elf_Word const  uShType     = pModElf->DynInfo.uJmpRelocType == DT_RELA ? SHT_RELA : SHT_REL;
-+        if (pShdrRelocs->sh_type != uShType)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_PLTREL does not match section type: %u vs %u",
-+                                       pszLogName, pShdrRelocs->sh_type, uShType);
-+        if (pShdrRelocs->sh_size != pModElf->DynInfo.cbJmpRelocs)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_PLTRELSZ does not match section size: %u vs %u",
-+                                       pszLogName, pShdrRelocs->sh_size, pModElf->DynInfo.cbJmpRelocs);
-+        if (uShType != uShTypeArch)
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT, "%s: DT_PLTREL does not match architecture: %u, arch wants %u",
-+                                       pszLogName, uShType, uShTypeArch);
-+    }
-+
-+    /*
-+     * Check that there aren't any other relocations hiding in the section table.
-+     */
-+    for (uint32_t i = 1; i < pModElf->Ehdr.e_shnum; i++)
-+        if (   (paShdrs[i].sh_type == SHT_REL || paShdrs[i].sh_type == SHT_RELA)
-+            && pModElf->paShdrExtras[i].uDtTag != DT_REL
-+            && pModElf->paShdrExtras[i].uDtTag != DT_RELA
-+            && pModElf->paShdrExtras[i].uDtTag != DT_JMPREL)
-+        {
-+            char szSecHdrNm[80];
-+            return RTERRINFO_LOG_SET_F(pErrInfo, VERR_BAD_EXE_FORMAT,
-+                                       "%s: section header #%u (%s type=" FMT_ELF_WORD " size=" FMT_ELF_XWORD ") contains relocations not referenced by the dynamic section",
-+                                       pszLogName, i,
-+                                       RTLDRELF_NAME(GetSHdrName)(pModElf, paShdrs[i].sh_name, szSecHdrNm, sizeof(szSecHdrNm)),
-+                                       paShdrs[i].sh_type, paShdrs[i].sh_size);
-+        }
- 
-     return VINF_SUCCESS;
- }
-@@ -1866,8 +2819,9 @@ static int RTLDRELF_NAME(ValidateSection
-  * @param   fFlags      Reserved, MBZ.
-  * @param   enmArch     Architecture specifier.
-  * @param   phLdrMod    Where to store the handle.
-+ * @param   pErrInfo    Where to return extended error info. Optional.
-  */
--static int RTLDRELF_NAME(Open)(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
-+static int RTLDRELF_NAME(Open)(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
- {
-     const char *pszLogName = pReader->pfnLogName(pReader);
-     uint64_t    cbRawImage = pReader->pfnSize(pReader);
-@@ -1891,21 +2845,42 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
- #else
-     pModElf->Core.enmArch   = RTLDRARCH_AMD64;
- #endif
--    //pModElf->pvBits         = NULL;
--    //pModElf->Ehdr           = {0};
--    //pModElf->paShdrs        = NULL;
--    //pModElf->paSyms         = NULL;
--    pModElf->iSymSh         = ~0U;
--    //pModElf->cSyms          = 0;
--    pModElf->iStrSh         = ~0U;
--    //pModElf->cbStr          = 0;
--    //pModElf->cbImage        = 0;
--    //pModElf->LinkAddress    = 0;
--    //pModElf->pStr           = NULL;
--    //pModElf->cbShStr        = 0;
--    //pModElf->pShStr         = NULL;
--    //pModElf->iShEhFrame      = 0;
--    //pModElf->iShEhFrameHdr   = 0;
-+    //pModElf->pvBits       = NULL;
-+    //pModElf->Ehdr         = {0};
-+    //pModElf->paShdrs      = NULL;
-+    //pModElf->Rel.paSyms   = NULL;
-+    pModElf->Rel.iSymSh     = ~0U;
-+    //pModElf->Rel.cSyms    = 0;
-+    pModElf->Rel.iStrSh     = ~0U;
-+    //pModElf->Rel.cbStr    = 0;
-+    //pModElf->Rel.pStr     = NULL;
-+    //pModElf->Dyn.paSyms   = NULL;
-+    pModElf->Dyn.iSymSh     = ~0U;
-+    //pModElf->Dyn.cSyms    = 0;
-+    pModElf->Dyn.iStrSh     = ~0U;
-+    //pModElf->Dyn.cbStr    = 0;
-+    //pModElf->Dyn.pStr     = NULL;
-+    pModElf->iFirstSect     = 1;
-+    //pModElf->fShdrInOrder = false;
-+    //pModElf->cbImage      = 0;
-+    pModElf->LinkAddress    = ~(Elf_Addr)0;
-+    //pModElf->cbShStr      = 0;
-+    //pModElf->pShStr       = NULL;
-+    //pModElf->iShEhFrame   = 0;
-+    //pModElf->iShEhFrameHdr= 0;
-+    pModElf->iShDynamic     = ~0U;
-+    //pModElf->cDynamic     = 0;
-+    //pModElf->paDynamic    = NULL;
-+    //pModElf->paPhdrs      = NULL;
-+    pModElf->DynInfo.uPtrRelocs         = ~(Elf_Addr)0;
-+    //pModElf->DynInfo.cbRelocs         = 0;
-+    //pModElf->DynInfo.cbRelocEntry     = 0;
-+    //pModElf->DynInfo.uRelocType       = 0;
-+    //pModElf->DynInfo.idxShRelocs      = 0;
-+    pModElf->DynInfo.uPtrJmpRelocs      = ~(Elf_Addr)0;
-+    //pModElf->DynInfo.cbJmpRelocs      = 0;
-+    //pModElf->DynInfo.uJmpRelocType    = 0;
-+    //pModElf->DynInfo.idxShJmpRelocs   = 0;
- 
-     /*
-      * Read and validate the ELF header and match up the CPU architecture.
-@@ -1914,7 +2889,7 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
-     if (RT_SUCCESS(rc))
-     {
-         RTLDRARCH enmArchImage = RTLDRARCH_INVALID; /* shut up gcc */
--        rc = RTLDRELF_NAME(ValidateElfHeader)(&pModElf->Ehdr, pszLogName, cbRawImage, &enmArchImage);
-+        rc = RTLDRELF_NAME(ValidateElfHeader)(&pModElf->Ehdr, cbRawImage, pszLogName, &enmArchImage, pErrInfo);
-         if (RT_SUCCESS(rc))
-         {
-             if (    enmArch != RTLDRARCH_WHATEVER
-@@ -1929,7 +2904,7 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
-          * introspection methods.
-          */
-         size_t const cbShdrs = pModElf->Ehdr.e_shnum * sizeof(Elf_Shdr);
--        Elf_Shdr *paShdrs = (Elf_Shdr *)RTMemAlloc(cbShdrs * 2);
-+        Elf_Shdr *paShdrs = (Elf_Shdr *)RTMemAlloc(cbShdrs * 2 + sizeof(RTLDRMODELFSHX) * pModElf->Ehdr.e_shnum);
-         if (paShdrs)
-         {
-             pModElf->paShdrs = paShdrs;
-@@ -1939,111 +2914,77 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
-                 memcpy(&paShdrs[pModElf->Ehdr.e_shnum], paShdrs, cbShdrs);
-                 pModElf->paOrgShdrs = &paShdrs[pModElf->Ehdr.e_shnum];
- 
-+                pModElf->paShdrExtras = (PRTLDRMODELFSHX)&pModElf->paOrgShdrs[pModElf->Ehdr.e_shnum];
-+                memset(pModElf->paShdrExtras, 0xff, sizeof(RTLDRMODELFSHX) * pModElf->Ehdr.e_shnum);
-+
-                 pModElf->cbShStr = paShdrs[pModElf->Ehdr.e_shstrndx].sh_size;
- 
-                 /*
-                  * Validate the section headers and find relevant sections.
-                  */
--                Elf_Addr uNextAddr = 0;
--                for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++)
--                {
--                    rc = RTLDRELF_NAME(ValidateSectionHeader)(pModElf, i, pszLogName, cbRawImage);
--                    if (RT_FAILURE(rc))
--                        break;
--
--                    /* We're looking for symbol tables. */
--                    if (paShdrs[i].sh_type == SHT_SYMTAB)
--                    {
--                        if (pModElf->iSymSh != ~0U)
--                        {
--                            Log(("RTLdrElf: %s: Multiple symbol tabs! iSymSh=%d i=%d\n", pszLogName, pModElf->iSymSh, i));
--                            rc = VERR_LDRELF_MULTIPLE_SYMTABS;
--                            break;
--                        }
--                        pModElf->iSymSh = i;
--                        pModElf->cSyms  = (unsigned)(paShdrs[i].sh_size / sizeof(Elf_Sym));
--                        AssertBreakStmt(pModElf->cSyms == paShdrs[i].sh_size / sizeof(Elf_Sym), rc = VERR_IMAGE_TOO_BIG);
--                        pModElf->iStrSh = paShdrs[i].sh_link;
--                        pModElf->cbStr  = (unsigned)paShdrs[pModElf->iStrSh].sh_size;
--                        AssertBreakStmt(pModElf->cbStr == paShdrs[pModElf->iStrSh].sh_size, rc = VERR_IMAGE_TOO_BIG);
--                    }
--
--                    /* Special checks for the section string table. */
--                    if (i == pModElf->Ehdr.e_shstrndx)
--                    {
--                        if (paShdrs[i].sh_type != SHT_STRTAB)
--                        {
--                            Log(("RTLdrElf: Section header string table is not a SHT_STRTAB: %#x\n", paShdrs[i].sh_type));
--                            rc = VERR_BAD_EXE_FORMAT;
--                            break;
--                        }
--                        if (paShdrs[i].sh_size == 0)
--                        {
--                            Log(("RTLdrElf: Section header string table is empty\n"));
--                            rc = VERR_BAD_EXE_FORMAT;
--                            break;
--                        }
--                    }
-+                rc = RTLDRELF_NAME(ValidateAndProcessSectionHeaders)(pModElf, paShdrs, cbRawImage, pszLogName, pErrInfo);
- 
--                    /* Kluge for the .data..percpu segment in 64-bit linux kernels. */
--                    if (paShdrs[i].sh_flags & SHF_ALLOC)
--                    {
--                        if (   paShdrs[i].sh_addr == 0
--                            && paShdrs[i].sh_addr < uNextAddr)
--                        {
--                            Elf_Addr uAddr = RT_ALIGN_T(uNextAddr, paShdrs[i].sh_addralign, Elf_Addr);
--                            Log(("RTLdrElf: Out of order section #%d; adjusting sh_addr from " FMT_ELF_ADDR " to " FMT_ELF_ADDR "\n",
--                                 i, paShdrs[i].sh_addr, uAddr));
--                            paShdrs[i].sh_addr = uAddr;
--                        }
--                        uNextAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size;
--                    }
--                } /* for each section header */
-+                /*
-+                 * Read validate and process program headers if ET_DYN or ET_EXEC.
-+                 */
-+                if (RT_SUCCESS(rc) && (pModElf->Ehdr.e_type == ET_DYN || pModElf->Ehdr.e_type == ET_EXEC))
-+                    rc = RTLDRELF_NAME(ValidateAndProcessDynamicInfo)(pModElf, cbRawImage, fFlags, pszLogName, pErrInfo);
- 
-                 /*
--                 * Calculate the image base address if the image isn't relocatable.
-+                 * Massage the section headers.
-                  */
--                if (RT_SUCCESS(rc) && pModElf->Ehdr.e_type != ET_REL)
-+                if (RT_SUCCESS(rc))
-                 {
--                    pModElf->LinkAddress = ~(Elf_Addr)0;
--                    for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++)
--                        if (   (paShdrs[i].sh_flags & SHF_ALLOC)
--                            && paShdrs[i].sh_addr < pModElf->LinkAddress)
--                            pModElf->LinkAddress = paShdrs[i].sh_addr;
--                    if (pModElf->LinkAddress == ~(Elf_Addr)0)
-+                    if (pModElf->Ehdr.e_type == ET_REL)
-                     {
--                        AssertFailed();
--                        rc = VERR_LDR_GENERAL_FAILURE;
--                    }
--                    if (pModElf->Ehdr.e_type == ET_DYN && pModElf->LinkAddress < 0x1000)
-+                        /* Do allocations and figure the image size: */
-                         pModElf->LinkAddress = 0;
-+                        for (unsigned i = 1; i < pModElf->Ehdr.e_shnum; i++)
-+                            if (paShdrs[i].sh_flags & SHF_ALLOC)
-+                            {
-+                                paShdrs[i].sh_addr = paShdrs[i].sh_addralign
-+                                                   ? RT_ALIGN_T(pModElf->cbImage, paShdrs[i].sh_addralign, Elf_Addr)
-+                                                   : (Elf_Addr)pModElf->cbImage;
-+                                Elf_Addr EndAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size;
-+                                if (pModElf->cbImage < EndAddr)
-+                                {
-+                                    pModElf->cbImage = (size_t)EndAddr;
-+                                    AssertMsgBreakStmt(pModElf->cbImage == EndAddr, (FMT_ELF_ADDR "\n", EndAddr), rc = VERR_IMAGE_TOO_BIG);
-+                                }
-+                                Log2(("RTLdrElf: %s: Assigned " FMT_ELF_ADDR " to section #%d\n", pszLogName, paShdrs[i].sh_addr, i));
-+                            }
-+                    }
-+                    else
-+                    {
-+                        /* Convert sh_addr to RVA: */
-+                        Assert(pModElf->LinkAddress != ~(Elf_Addr)0);
-+                        for (unsigned i = 0 /*!*/; i < pModElf->Ehdr.e_shnum; i++)
-+                            if (paShdrs[i].sh_flags & SHF_ALLOC)
-+                                    paShdrs[i].sh_addr -= pModElf->LinkAddress;
-+                    }
-                 }
- 
-                 /*
--                 * Perform allocations / RVA calculations, determine the image size.
-+                 * Check if the sections are in order by address, as that will simplify
-+                 * enumeration and address translation.
-                  */
--                if (RT_SUCCESS(rc))
--                    for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++)
--                        if (paShdrs[i].sh_flags & SHF_ALLOC)
-+                pModElf->fShdrInOrder = true;
-+                Elf_Addr uEndAddr = 0;
-+                for (unsigned i = pModElf->iFirstSect; i < pModElf->Ehdr.e_shnum; i++)
-+                    if (paShdrs[i].sh_flags & SHF_ALLOC)
-+                    {
-+                        if (uEndAddr <= paShdrs[i].sh_addr)
-+                            uEndAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size;
-+                        else
-                         {
--                            if (pModElf->Ehdr.e_type == ET_REL)
--                                paShdrs[i].sh_addr = paShdrs[i].sh_addralign
--                                                   ? RT_ALIGN_T(pModElf->cbImage, paShdrs[i].sh_addralign, Elf_Addr)
--                                                   : (Elf_Addr)pModElf->cbImage;
--                            else
--                                paShdrs[i].sh_addr -= pModElf->LinkAddress;
--                            Elf_Addr EndAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size;
--                            if (pModElf->cbImage < EndAddr)
--                            {
--                                pModElf->cbImage = (size_t)EndAddr;
--                                AssertMsgBreakStmt(pModElf->cbImage == EndAddr, (FMT_ELF_ADDR "\n", EndAddr), rc = VERR_IMAGE_TOO_BIG);
--                            }
--                            Log2(("RTLdrElf: %s: Assigned " FMT_ELF_ADDR " to section #%d\n", pszLogName, paShdrs[i].sh_addr, i));
-+                            pModElf->fShdrInOrder = false;
-+                            break;
-                         }
-+                    }
- 
--                Log2(("RTLdrElf: iSymSh=%u cSyms=%u iStrSh=%u cbStr=%u rc=%Rrc cbImage=%#zx LinkAddress=" FMT_ELF_ADDR "\n",
--                      pModElf->iSymSh, pModElf->cSyms, pModElf->iStrSh, pModElf->cbStr, rc,
--                      pModElf->cbImage, pModElf->LinkAddress));
-+                Log2(("RTLdrElf: iSymSh=%u cSyms=%u iStrSh=%u cbStr=%u rc=%Rrc cbImage=%#zx LinkAddress=" FMT_ELF_ADDR " fShdrInOrder=%RTbool\n",
-+                      pModElf->Rel.iSymSh, pModElf->Rel.cSyms, pModElf->Rel.iStrSh, pModElf->Rel.cbStr, rc,
-+                      pModElf->cbImage, pModElf->LinkAddress, pModElf->fShdrInOrder));
-                 if (RT_SUCCESS(rc))
-                 {
-                     pModElf->Core.pOps      = &RTLDRELF_MID(s_rtldrElf,Ops);
-@@ -2077,6 +3018,7 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
- #undef RTLDRELF_MID
- 
- #undef FMT_ELF_ADDR
-+#undef FMT_ELF_ADDR7
- #undef FMT_ELF_HALF
- #undef FMT_ELF_SHALF
- #undef FMT_ELF_OFF
-@@ -2102,6 +3044,8 @@ static int RTLDRELF_NAME(Open)(PRTLDRREA
- #undef Elf_Size
- #undef Elf_Sword
- #undef Elf_Word
-+#undef Elf_Xword
-+#undef Elf_Sxword
- 
- #undef RTLDRMODELF
- #undef PRTLDRMODELF
---- a/include/iprt/memobj.h
-+++ b/include/iprt/memobj.h
-@@ -127,7 +127,10 @@ RTR0DECL(int) RTR0MemObjFree(RTR0MEMOBJ
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  */
- #define RTR0MemObjAllocPage(pMemObj, cb, fExecutable) \
-     RTR0MemObjAllocPageTag((pMemObj), (cb), (fExecutable), RTMEM_TAG)
-@@ -140,7 +143,10 @@ RTR0DECL(int) RTR0MemObjFree(RTR0MEMOBJ
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  * @param   pszTag          Allocation tag used for statistics and such.
-  */
- RTR0DECL(int) RTR0MemObjAllocPageTag(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable, const char *pszTag);
-@@ -154,7 +160,10 @@ RTR0DECL(int) RTR0MemObjAllocPageTag(PRT
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  */
- #define RTR0MemObjAllocLow(pMemObj, cb, fExecutable) \
-     RTR0MemObjAllocLowTag((pMemObj), (cb), (fExecutable), RTMEM_TAG)
-@@ -168,7 +177,10 @@ RTR0DECL(int) RTR0MemObjAllocPageTag(PRT
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  * @param   pszTag          Allocation tag used for statistics and such.
-  */
- RTR0DECL(int) RTR0MemObjAllocLowTag(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable, const char *pszTag);
-@@ -182,7 +194,10 @@ RTR0DECL(int) RTR0MemObjAllocLowTag(PRTR
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  */
- #define RTR0MemObjAllocCont(pMemObj, cb, fExecutable) \
-     RTR0MemObjAllocContTag((pMemObj), (cb), (fExecutable), RTMEM_TAG)
-@@ -196,7 +211,10 @@ RTR0DECL(int) RTR0MemObjAllocLowTag(PRTR
-  * @returns IPRT status code.
-  * @param   pMemObj         Where to store the ring-0 memory object handle.
-  * @param   cb              Number of bytes to allocate. This is rounded up to nearest page.
-- * @param   fExecutable     Flag indicating whether it should be permitted to executed code in the memory object.
-+ * @param   fExecutable     Flag indicating whether it should be permitted to
-+ *                          executed code in the memory object.  The user must
-+ *                          use RTR0MemObjProtect after initialization the
-+ *                          allocation to actually make it executable.
-  * @param   pszTag          Allocation tag used for statistics and such.
-  */
- RTR0DECL(int) RTR0MemObjAllocContTag(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable, const char *pszTag);
---- a/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c
-+++ b/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c
-@@ -38,7 +38,7 @@
- 
- 
- #if (defined(RT_ARCH_AMD64) || defined(DOXYGEN_RUNNING)) && !defined(RTMEMALLOC_EXEC_HEAP)
--# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
-+# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)
- /**
-  * Starting with 2.6.23 we can use __get_vm_area and map_vm_area to allocate
-  * memory in the moduel range.  This is preferrable to the exec heap below.
---- a/include/VBox/sup.h
-+++ b/include/VBox/sup.h
-@@ -1553,8 +1553,11 @@ SUPR3DECL(int) SUPR3GetSymbolR0(void *pv
-  *
-  * @returns VBox status code.
-  * @deprecated  Use SUPR3LoadModule(pszFilename, "VMMR0.r0", &pvImageBase)
-+ * @param   pszFilename     Full path to the VMMR0.r0 file (silly).
-+ * @param   pErrInfo        Where to return extended error information.
-+ *                          Optional.
-  */
--SUPR3DECL(int) SUPR3LoadVMM(const char *pszFilename);
-+SUPR3DECL(int) SUPR3LoadVMM(const char *pszFilename, PRTERRINFO pErrInfo);
- 
- /**
-  * Unloads R0 HC VMM code.
---- a/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp
-+++ b/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp
-@@ -846,7 +846,7 @@ extern "C" DECLEXPORT(int) TrustedMain(i
-         return 1;
-     }
- 
--    rc = SUPR3LoadVMM(szAbsPath);
-+    rc = SUPR3LoadVMM(szAbsPath, NULL);
-     if (RT_FAILURE(rc))
-     {
-         RTPrintf("tstIntNet-1: SUPR3LoadVMM(\"%s\") -> %Rrc\n", szAbsPath, rc);
---- a/src/VBox/NetworkServices/Dhcpd/VBoxNetDhcpd.cpp
-+++ b/src/VBox/NetworkServices/Dhcpd/VBoxNetDhcpd.cpp
-@@ -259,7 +259,7 @@ int VBoxNetDhcpd::vmmInit()
-     if (RT_SUCCESS(rc))
-         rc = RTPathAppend(szPathVMMR0, sizeof(szPathVMMR0), "VMMR0.r0");
-     if (RT_SUCCESS(rc))
--        rc = SUPR3LoadVMM(szPathVMMR0);
-+        rc = SUPR3LoadVMM(szPathVMMR0, NULL /*pErrInfo*/);
-     return rc;
- }
- 
---- a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
-+++ b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
-@@ -383,7 +383,7 @@ int VBoxNetBaseService::tryGoOnline(void
-         return rc;
-     }
- 
--    rc = SUPR3LoadVMM(strcat(szPath, "/VMMR0.r0"));
-+    rc = SUPR3LoadVMM(strcat(szPath, "/VMMR0.r0"), NULL);
-     if (RT_FAILURE(rc))
-     {
-         LogRel(("VBoxNetBaseService: SUPR3LoadVMM(\"%s\") -> %Rrc\n", szPath, rc));
---- a/src/VBox/VMM/testcase/tstGlobalConfig.cpp
-+++ b/src/VBox/VMM/testcase/tstGlobalConfig.cpp
-@@ -102,7 +102,7 @@ extern "C" DECLEXPORT(int) TrustedMain(i
-         return 1;
-     }
- 
--    rc = SUPR3LoadVMM("./VMMR0.r0");
-+    rc = SUPR3LoadVMM("./VMMR0.r0", NULL /*pErrInfo*/);
-     if (RT_SUCCESS(rc))
-     {
-         Req.pSession = pSession;
---- a/src/VBox/HostDrivers/Support/SUPLibLdr.cpp
-+++ b/src/VBox/HostDrivers/Support/SUPLibLdr.cpp
-@@ -334,6 +334,372 @@ static DECLCALLBACK(int) supLoadModuleCr
- }
- 
- 
-+/** Argument package for supLoadModuleCompileSegmentsCB. */
-+typedef struct SUPLDRCOMPSEGTABARGS
-+{
-+    uint32_t        uStartRva;
-+    uint32_t        uEndRva;
-+    uint32_t        fProt;
-+    uint32_t        iSegs;
-+    uint32_t        cSegsAlloc;
-+    PSUPLDRSEG      paSegs;
-+    PRTERRINFO      pErrInfo;
-+} SUPLDRCOMPSEGTABARGS, *PSUPLDRCOMPSEGTABARGS;
-+
-+/**
-+ * @callback_method_impl{FNRTLDRENUMSEGS,
-+ *  Compile list of segments with the same memory protection.}
-+ */
-+static DECLCALLBACK(int) supLoadModuleCompileSegmentsCB(RTLDRMOD hLdrMod, PCRTLDRSEG pSeg, void *pvUser)
-+{
-+    PSUPLDRCOMPSEGTABARGS pArgs = (PSUPLDRCOMPSEGTABARGS)pvUser;
-+    AssertCompile(RTMEM_PROT_READ  == SUPLDR_PROT_READ);
-+    AssertCompile(RTMEM_PROT_WRITE == SUPLDR_PROT_WRITE);
-+    AssertCompile(RTMEM_PROT_EXEC  == SUPLDR_PROT_EXEC);
-+    RT_NOREF(hLdrMod);
-+
-+    Log2(("supLoadModuleCompileSegmentsCB: %RTptr/%RTptr LB %RTptr/%RTptr prot %#x %s\n",
-+          pSeg->LinkAddress, pSeg->RVA, pSeg->cbMapped, pSeg->cb, pSeg->fProt, pSeg->pszName));
-+
-+    /* Ignore segments not part of the loaded image. */
-+    if (pSeg->RVA == NIL_RTLDRADDR || pSeg->cbMapped == 0)
-+    {
-+        Log2(("supLoadModuleCompileSegmentsCB: -> skipped\n"));
-+        return VINF_SUCCESS;
-+    }
-+
-+    /* We currently ASSUME that all relevant segments are in ascending RVA order. */
-+    AssertReturn(pSeg->RVA >= pArgs->uEndRva,
-+                 RTERRINFO_LOG_REL_SET_F(pArgs->pErrInfo, VERR_BAD_EXE_FORMAT, "Out of order segment: %p LB %#zx #%.*s",
-+                                         pSeg->RVA, pSeg->cb, pSeg->cchName, pSeg->pszName));
-+
-+    /* We ASSUME the cbMapped field is implemented. */
-+    AssertReturn(pSeg->cbMapped != NIL_RTLDRADDR, VERR_INTERNAL_ERROR_2);
-+    AssertReturn(pSeg->cbMapped < _1G, VERR_INTERNAL_ERROR_4);
-+    uint32_t cbMapped = (uint32_t)pSeg->cbMapped;
-+    AssertReturn(pSeg->RVA      < _1G, VERR_INTERNAL_ERROR_3);
-+    uint32_t uRvaSeg  = (uint32_t)pSeg->RVA;
-+
-+    /*
-+     * If the protection is the same as the previous segment,
-+     * just update uEndRva and continue.
-+     */
-+    uint32_t fProt = pSeg->fProt;
-+#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
-+    if (fProt & RTMEM_PROT_EXEC)
-+        fProt |= fProt & RTMEM_PROT_READ;
-+#endif
-+    if (pSeg->fProt == pArgs->fProt)
-+    {
-+        pArgs->uEndRva = uRvaSeg + cbMapped;
-+        Log2(("supLoadModuleCompileSegmentsCB: -> merged, end %#x\n", pArgs->uEndRva));
-+        return VINF_SUCCESS;
-+    }
-+
-+    /*
-+     * The protection differs, so commit current segment and start a new one.
-+     * However, if the new segment and old segment share a page, this becomes
-+     * a little more complicated...
-+     */
-+    if (pArgs->uStartRva < pArgs->uEndRva)
-+    {
-+        if (((pArgs->uEndRva - 1) >> PAGE_SHIFT) != (uRvaSeg >> PAGE_SHIFT))
-+        {
-+            /* No common page, so make the new segment start on a page boundrary. */
-+            cbMapped += uRvaSeg & PAGE_OFFSET_MASK;
-+            uRvaSeg &= ~(uint32_t)PAGE_OFFSET_MASK;
-+            Assert(pArgs->uEndRva <= uRvaSeg);
-+            Log2(("supLoadModuleCompileSegmentsCB: -> new, no common\n"));
-+        }
-+        else if ((fProt & pArgs->fProt) == fProt)
-+        {
-+            /* The current segment includes the memory protections of the
-+               previous, so include the common page in it: */
-+            uint32_t const cbCommon = PAGE_SIZE - (uRvaSeg & PAGE_OFFSET_MASK);
-+            if (cbCommon >= cbMapped)
-+            {
-+                pArgs->uEndRva = uRvaSeg + cbMapped;
-+                Log2(("supLoadModuleCompileSegmentsCB: -> merge, %#x common, upgrading prot to %#x, end %#x\n",
-+                      cbCommon, pArgs->fProt, pArgs->uEndRva));
-+                return VINF_SUCCESS; /* New segment was smaller than a page. */
-+            }
-+            cbMapped -= cbCommon;
-+            uRvaSeg  += cbCommon;
-+            Assert(pArgs->uEndRva <= uRvaSeg);
-+            Log2(("supLoadModuleCompileSegmentsCB: -> new, %#x common into previous\n", cbCommon));
-+        }
-+        else if ((fProt & pArgs->fProt) == pArgs->fProt)
-+        {
-+            /* The new segment includes the memory protections of the
-+               previous, so include the common page in it: */
-+            cbMapped += uRvaSeg & PAGE_OFFSET_MASK;
-+            uRvaSeg &= ~(uint32_t)PAGE_OFFSET_MASK;
-+            if (uRvaSeg == pArgs->uStartRva)
-+            {
-+                pArgs->fProt   = fProt;
-+                pArgs->uEndRva = uRvaSeg + cbMapped;
-+                Log2(("supLoadModuleCompileSegmentsCB: -> upgrade current protection, end %#x\n", pArgs->uEndRva));
-+                return VINF_SUCCESS; /* Current segment was smaller than a page. */
-+            }
-+            Log2(("supLoadModuleCompileSegmentsCB: -> new, %#x common into new\n", (uint32_t)(pSeg->RVA & PAGE_OFFSET_MASK)));
-+        }
-+        else
-+        {
-+            /* Create a new segment for the common page with the combined protection. */
-+            Log2(("supLoadModuleCompileSegmentsCB: -> it's complicated...\n"));
-+            pArgs->uEndRva &= ~(uint32_t)PAGE_OFFSET_MASK;
-+            if (pArgs->uEndRva > pArgs->uStartRva)
-+            {
-+                Log2(("supLoadModuleCompileSegmentsCB: SUP Seg #%u: %#x LB %#x prot %#x\n",
-+                      pArgs->iSegs, pArgs->uStartRva, pArgs->uEndRva - pArgs->uStartRva, pArgs->fProt));
-+                if (pArgs->paSegs)
-+                {
-+                    AssertReturn(pArgs->iSegs < pArgs->cSegsAlloc, VERR_INTERNAL_ERROR_5);
-+                    pArgs->paSegs[pArgs->iSegs].off     = pArgs->uStartRva;
-+                    pArgs->paSegs[pArgs->iSegs].cb      = pArgs->uEndRva - pArgs->uStartRva;
-+                    pArgs->paSegs[pArgs->iSegs].fProt   = pArgs->fProt;
-+                    pArgs->paSegs[pArgs->iSegs].fUnused = 0;
-+                }
-+                pArgs->iSegs++;
-+                pArgs->uStartRva = pArgs->uEndRva;
-+            }
-+            pArgs->fProt |= fProt;
-+
-+            uint32_t const cbCommon = PAGE_SIZE - (uRvaSeg & PAGE_OFFSET_MASK);
-+            if (cbCommon >= cbMapped)
-+            {
-+                fProt |= pArgs->fProt;
-+                pArgs->uEndRva = uRvaSeg + cbMapped;
-+                return VINF_SUCCESS; /* New segment was smaller than a page. */
-+            }
-+            cbMapped -= cbCommon;
-+            uRvaSeg  += cbCommon;
-+            Assert(uRvaSeg - pArgs->uStartRva == PAGE_SIZE);
-+        }
-+
-+        /* The current segment should end where the new one starts, no gaps. */
-+        pArgs->uEndRva = uRvaSeg;
-+
-+        /* Emit the current segment */
-+        Log2(("supLoadModuleCompileSegmentsCB: SUP Seg #%u: %#x LB %#x prot %#x\n",
-+              pArgs->iSegs, pArgs->uStartRva, pArgs->uEndRva - pArgs->uStartRva, pArgs->fProt));
-+        if (pArgs->paSegs)
-+        {
-+            AssertReturn(pArgs->iSegs < pArgs->cSegsAlloc, VERR_INTERNAL_ERROR_5);
-+            pArgs->paSegs[pArgs->iSegs].off     = pArgs->uStartRva;
-+            pArgs->paSegs[pArgs->iSegs].cb      = pArgs->uEndRva - pArgs->uStartRva;
-+            pArgs->paSegs[pArgs->iSegs].fProt   = pArgs->fProt;
-+            pArgs->paSegs[pArgs->iSegs].fUnused = 0;
-+        }
-+        pArgs->iSegs++;
-+    }
-+    /* else: current segment is empty */
-+
-+    /* Start the new segment. */
-+    Assert(!(uRvaSeg & PAGE_OFFSET_MASK));
-+    pArgs->fProt     = fProt;
-+    pArgs->uStartRva = uRvaSeg;
-+    pArgs->uEndRva   = uRvaSeg + cbMapped;
-+    return VINF_SUCCESS;
-+}
-+
-+
-+/**
-+ * Worker for supLoadModule().
-+ */
-+static int supLoadModuleInner(RTLDRMOD hLdrMod, PSUPLDRLOAD pLoadReq, uint32_t cbImageWithEverything,
-+                              RTR0PTR uImageBase, size_t cbImage, const char *pszModule, const char *pszFilename,
-+                              bool fNativeLoader, bool fIsVMMR0, const char *pszSrvReqHandler,
-+                              uint32_t offSymTab, uint32_t cSymbols,
-+                              uint32_t offStrTab, size_t cbStrTab,
-+                              uint32_t offSegTab, uint32_t cSegments,
-+                              PRTERRINFO pErrInfo)
-+{
-+    /*
-+     * Get the image bits.
-+     */
-+    SUPLDRRESIMPARGS Args = { pszModule, pErrInfo };
-+    int rc = RTLdrGetBits(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase, supLoadModuleResolveImport, &Args);
-+    if (RT_FAILURE(rc))
-+    {
-+        LogRel(("SUP: RTLdrGetBits failed for %s (%s). rc=%Rrc\n", pszModule, pszFilename, rc));
-+        if (!RTErrInfoIsSet(pErrInfo))
-+            RTErrInfoSetF(pErrInfo, rc, "RTLdrGetBits failed");
-+        return rc;
-+    }
-+
-+    /*
-+     * Get the entry points.
-+     */
-+    RTUINTPTR VMMR0EntryFast = 0;
-+    RTUINTPTR VMMR0EntryEx = 0;
-+    RTUINTPTR SrvReqHandler = 0;
-+    RTUINTPTR ModuleInit = 0;
-+    RTUINTPTR ModuleTerm = 0;
-+    const char *pszEp = NULL;
-+    if (fIsVMMR0)
-+    {
-+        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase,
-+                              UINT32_MAX, pszEp = "VMMR0EntryFast", &VMMR0EntryFast);
-+        if (RT_SUCCESS(rc))
-+            rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase,
-+                                  UINT32_MAX, pszEp = "VMMR0EntryEx", &VMMR0EntryEx);
-+    }
-+    else if (pszSrvReqHandler)
-+        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase,
-+                              UINT32_MAX, pszEp = pszSrvReqHandler, &SrvReqHandler);
-+    if (RT_SUCCESS(rc))
-+    {
-+        int rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase,
-+                                   UINT32_MAX, pszEp = "ModuleInit", &ModuleInit);
-+        if (RT_FAILURE(rc2))
-+            ModuleInit = 0;
-+
-+        rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], uImageBase,
-+                               UINT32_MAX, pszEp = "ModuleTerm", &ModuleTerm);
-+        if (RT_FAILURE(rc2))
-+            ModuleTerm = 0;
-+    }
-+    if (RT_FAILURE(rc))
-+    {
-+        LogRel(("SUP: Failed to get entry point '%s' for %s (%s) rc=%Rrc\n", pszEp, pszModule, pszFilename, rc));
-+        return RTErrInfoSetF(pErrInfo, rc, "Failed to resolve entry point '%s'", pszEp);
-+    }
-+
-+    /*
-+     * Create the symbol and string tables.
-+     */
-+    SUPLDRCREATETABSARGS CreateArgs;
-+    CreateArgs.cbImage = cbImage;
-+    CreateArgs.pSym    = (PSUPLDRSYM)&pLoadReq->u.In.abImage[offSymTab];
-+    CreateArgs.pszBase =     (char *)&pLoadReq->u.In.abImage[offStrTab];
-+    CreateArgs.psz     = CreateArgs.pszBase;
-+    rc = RTLdrEnumSymbols(hLdrMod, 0, NULL, 0, supLoadModuleCreateTabsCB, &CreateArgs);
-+    if (RT_FAILURE(rc))
-+    {
-+        LogRel(("SUP: RTLdrEnumSymbols failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
-+        return RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSymbols #2 failed");
-+    }
-+    AssertRelease((size_t)(CreateArgs.psz  - CreateArgs.pszBase) <= cbStrTab);
-+    AssertRelease((size_t)(CreateArgs.pSym - (PSUPLDRSYM)&pLoadReq->u.In.abImage[offSymTab]) <= cSymbols);
-+
-+    /*
-+     * Create the segment table.
-+     */
-+    SUPLDRCOMPSEGTABARGS SegArgs;
-+    SegArgs.uStartRva   = 0;
-+    SegArgs.uEndRva     = 0;
-+    SegArgs.fProt       = RTMEM_PROT_READ;
-+    SegArgs.iSegs       = 0;
-+    SegArgs.cSegsAlloc  = cSegments;
-+    SegArgs.paSegs      = (PSUPLDRSEG)&pLoadReq->u.In.abImage[offSegTab];
-+    SegArgs.pErrInfo    = pErrInfo;
-+    rc = RTLdrEnumSegments(hLdrMod, supLoadModuleCompileSegmentsCB, &SegArgs);
-+    if (RT_FAILURE(rc))
-+    {
-+        LogRel(("SUP: RTLdrEnumSegments failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
-+        return RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSegments #2 failed");
-+    }
-+    SegArgs.uEndRva = (uint32_t)cbImage;
-+    AssertReturn(SegArgs.uEndRva == cbImage, VERR_OUT_OF_RANGE);
-+    if (SegArgs.uEndRva > SegArgs.uStartRva)
-+    {
-+        SegArgs.paSegs[SegArgs.iSegs].off     = SegArgs.uStartRva;
-+        SegArgs.paSegs[SegArgs.iSegs].cb      = SegArgs.uEndRva - SegArgs.uStartRva;
-+        SegArgs.paSegs[SegArgs.iSegs].fProt   = SegArgs.fProt;
-+        SegArgs.paSegs[SegArgs.iSegs].fUnused = 0;
-+        SegArgs.iSegs++;
-+    }
-+    for (uint32_t i = 0; i < SegArgs.iSegs; i++)
-+        LogRel(("SUP: seg #%u: %c%c%c %#010RX32 LB %#010RX32\n", i, /** @todo LogRel2 */
-+                SegArgs.paSegs[i].fProt & SUPLDR_PROT_READ  ? 'R' : ' ',
-+                SegArgs.paSegs[i].fProt & SUPLDR_PROT_WRITE ? 'W' : ' ',
-+                SegArgs.paSegs[i].fProt & SUPLDR_PROT_EXEC  ? 'X' : ' ',
-+                SegArgs.paSegs[i].off, SegArgs.paSegs[i].cb));
-+    AssertRelease(SegArgs.iSegs == cSegments);
-+    AssertRelease(SegArgs.cSegsAlloc == cSegments);
-+
-+    /*
-+     * Upload the image.
-+     */
-+    pLoadReq->Hdr.u32Cookie = g_u32Cookie;
-+    pLoadReq->Hdr.u32SessionCookie = g_u32SessionCookie;
-+    pLoadReq->Hdr.cbIn = SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImageWithEverything);
-+    pLoadReq->Hdr.cbOut = SUP_IOCTL_LDR_LOAD_SIZE_OUT;
-+    pLoadReq->Hdr.fFlags = SUPREQHDR_FLAGS_MAGIC | SUPREQHDR_FLAGS_EXTRA_IN;
-+    pLoadReq->Hdr.rc = VERR_INTERNAL_ERROR;
-+
-+    pLoadReq->u.In.pfnModuleInit              = (RTR0PTR)ModuleInit;
-+    pLoadReq->u.In.pfnModuleTerm              = (RTR0PTR)ModuleTerm;
-+    if (fIsVMMR0)
-+    {
-+        pLoadReq->u.In.eEPType                = SUPLDRLOADEP_VMMR0;
-+        pLoadReq->u.In.EP.VMMR0.pvVMMR0       = uImageBase;
-+        pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryFast= (RTR0PTR)VMMR0EntryFast;
-+        pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryEx  = (RTR0PTR)VMMR0EntryEx;
-+    }
-+    else if (pszSrvReqHandler)
-+    {
-+        pLoadReq->u.In.eEPType                = SUPLDRLOADEP_SERVICE;
-+        pLoadReq->u.In.EP.Service.pfnServiceReq = (RTR0PTR)SrvReqHandler;
-+        pLoadReq->u.In.EP.Service.apvReserved[0] = NIL_RTR0PTR;
-+        pLoadReq->u.In.EP.Service.apvReserved[1] = NIL_RTR0PTR;
-+        pLoadReq->u.In.EP.Service.apvReserved[2] = NIL_RTR0PTR;
-+    }
-+    else
-+        pLoadReq->u.In.eEPType                = SUPLDRLOADEP_NOTHING;
-+    pLoadReq->u.In.offStrTab                  = offStrTab;
-+    pLoadReq->u.In.cbStrTab                   = (uint32_t)cbStrTab;
-+    AssertRelease(pLoadReq->u.In.cbStrTab == cbStrTab);
-+    pLoadReq->u.In.cbImageBits                = (uint32_t)cbImage;
-+    pLoadReq->u.In.offSymbols                 = offSymTab;
-+    pLoadReq->u.In.cSymbols                   = cSymbols;
-+    pLoadReq->u.In.offSegments                = offSegTab;
-+    pLoadReq->u.In.cSegments                  = cSegments;
-+    pLoadReq->u.In.cbImageWithEverything      = cbImageWithEverything;
-+    pLoadReq->u.In.pvImageBase                = uImageBase;
-+    if (!g_uSupFakeMode)
-+    {
-+        rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_LOAD, pLoadReq, SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithEverything));
-+        if (RT_SUCCESS(rc))
-+            rc = pLoadReq->Hdr.rc;
-+        else
-+            LogRel(("SUP: SUP_IOCTL_LDR_LOAD ioctl for %s (%s) failed rc=%Rrc\n", pszModule, pszFilename, rc));
-+    }
-+    else
-+        rc = VINF_SUCCESS;
-+    if (    RT_SUCCESS(rc)
-+        ||  rc == VERR_ALREADY_LOADED /* A competing process. */
-+       )
-+    {
-+        LogRel(("SUP: Loaded %s (%s) at %#RKv - ModuleInit at %RKv and ModuleTerm at %RKv%s\n",
-+                pszModule, pszFilename, uImageBase, (RTR0PTR)ModuleInit, (RTR0PTR)ModuleTerm,
-+                fNativeLoader ? " using the native ring-0 loader" : ""));
-+        if (fIsVMMR0)
-+        {
-+            g_pvVMMR0 = uImageBase;
-+            LogRel(("SUP: VMMR0EntryEx located at %RKv and VMMR0EntryFast at %RKv\n", (RTR0PTR)VMMR0EntryEx, (RTR0PTR)VMMR0EntryFast));
-+        }
-+#ifdef RT_OS_WINDOWS
-+        LogRel(("SUP: windbg> .reload /f %s=%#RKv\n", pszFilename, uImageBase));
-+#endif
-+        return VINF_SUCCESS;
-+    }
-+
-+    /*
-+     * Failed, bail out.
-+     */
-+    LogRel(("SUP: Loading failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
-+    if (   pLoadReq->u.Out.uErrorMagic == SUPLDRLOAD_ERROR_MAGIC
-+        && pLoadReq->u.Out.szError[0] != '\0')
-+    {
-+        LogRel(("SUP: %s\n", pLoadReq->u.Out.szError));
-+        return RTErrInfoSet(pErrInfo, rc, pLoadReq->u.Out.szError);
-+    }
-+    return RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_LOAD failed");
-+}
-+
-+
- /**
-  * Worker for SUPR3LoadModule().
-  *
-@@ -356,6 +722,7 @@ static int supLoadModule(const char *psz
-     AssertPtrReturn(pszFilename, VERR_INVALID_PARAMETER);
-     AssertPtrReturn(pszModule, VERR_INVALID_PARAMETER);
-     AssertPtrReturn(ppvImageBase, VERR_INVALID_PARAMETER);
-+    /** @todo abspath it right into SUPLDROPEN */
-     AssertReturn(strlen(pszModule) < RT_SIZEOFMEMB(SUPLDROPEN, u.In.szName), VERR_FILENAME_TOO_LONG);
-     char szAbsFilename[RT_SIZEOFMEMB(SUPLDROPEN, u.In.szFilename)];
-     rc = RTPathAbs(pszFilename, szAbsFilename, sizeof(szAbsFilename));
-@@ -371,8 +738,8 @@ static int supLoadModule(const char *psz
-      * Open image file and figure its size.
-      */
-     RTLDRMOD hLdrMod;
--    rc = RTLdrOpen(pszFilename, 0, RTLDRARCH_HOST, &hLdrMod);
--    if (!RT_SUCCESS(rc))
-+    rc = RTLdrOpenEx(pszFilename, 0 /*fFlags*/, RTLDRARCH_HOST, &hLdrMod, pErrInfo);
-+    if (RT_FAILURE(rc))
-     {
-         LogRel(("SUP: RTLdrOpen failed for %s (%s) %Rrc\n", pszModule, pszFilename, rc));
-         return rc;
-@@ -385,230 +752,109 @@ static int supLoadModule(const char *psz
-     rc = RTLdrEnumSymbols(hLdrMod, 0, NULL, 0, supLoadModuleCalcSizeCB, &CalcArgs);
-     if (RT_SUCCESS(rc))
-     {
--        const uint32_t  offSymTab = RT_ALIGN_32(CalcArgs.cbImage, 8);
--        const uint32_t  offStrTab = offSymTab + CalcArgs.cSymbols * sizeof(SUPLDRSYM);
--        const uint32_t  cbImageWithTabs = RT_ALIGN_32(offStrTab + CalcArgs.cbStrings, 8);
--
-         /*
--         * Open the R0 image.
-+         * Figure out the number of segments needed first.
-          */
--        SUPLDROPEN OpenReq;
--        OpenReq.Hdr.u32Cookie = g_u32Cookie;
--        OpenReq.Hdr.u32SessionCookie = g_u32SessionCookie;
--        OpenReq.Hdr.cbIn = SUP_IOCTL_LDR_OPEN_SIZE_IN;
--        OpenReq.Hdr.cbOut = SUP_IOCTL_LDR_OPEN_SIZE_OUT;
--        OpenReq.Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT;
--        OpenReq.Hdr.rc = VERR_INTERNAL_ERROR;
--        OpenReq.u.In.cbImageWithTabs = cbImageWithTabs;
--        OpenReq.u.In.cbImageBits = (uint32_t)CalcArgs.cbImage;
--        strcpy(OpenReq.u.In.szName, pszModule);
--        strcpy(OpenReq.u.In.szFilename, pszFilename);
--        if (!g_uSupFakeMode)
--        {
--            rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_OPEN, &OpenReq, SUP_IOCTL_LDR_OPEN_SIZE);
--            if (RT_SUCCESS(rc))
--                rc = OpenReq.Hdr.rc;
--        }
--        else
--        {
--            OpenReq.u.Out.fNeedsLoading = true;
--            OpenReq.u.Out.pvImageBase = 0xef423420;
--        }
--        *ppvImageBase = (void *)OpenReq.u.Out.pvImageBase;
--        if (    RT_SUCCESS(rc)
--            &&  OpenReq.u.Out.fNeedsLoading)
-+        SUPLDRCOMPSEGTABARGS SegArgs;
-+        SegArgs.uStartRva   = 0;
-+        SegArgs.uEndRva     = 0;
-+        SegArgs.fProt       = RTMEM_PROT_READ;
-+        SegArgs.iSegs       = 0;
-+        SegArgs.cSegsAlloc  = 0;
-+        SegArgs.paSegs      = NULL;
-+        SegArgs.pErrInfo    = pErrInfo;
-+        rc = RTLdrEnumSegments(hLdrMod, supLoadModuleCompileSegmentsCB, &SegArgs);
-+        if (RT_SUCCESS(rc))
-         {
-+            Assert(SegArgs.uEndRva <= RTLdrSize(hLdrMod));
-+            SegArgs.uEndRva = (uint32_t)CalcArgs.cbImage; /* overflow is checked later */
-+            if (SegArgs.uEndRva > SegArgs.uStartRva)
-+            {
-+                Log2(("supLoadModule:                  SUP Seg #%u: %#x LB %#x prot %#x\n",
-+                      SegArgs.iSegs, SegArgs.uStartRva, SegArgs.uEndRva - SegArgs.uStartRva, SegArgs.fProt));
-+                SegArgs.iSegs++;
-+            }
-+
-+            const uint32_t offSymTab = RT_ALIGN_32(CalcArgs.cbImage, 8);
-+            const uint32_t offStrTab = offSymTab + CalcArgs.cSymbols * sizeof(SUPLDRSYM);
-+            const uint32_t offSegTab = RT_ALIGN_32(offStrTab + CalcArgs.cbStrings, 8);
-+            const uint32_t cbImageWithEverything = RT_ALIGN_32(offSegTab + sizeof(SUPLDRSEG) * SegArgs.iSegs, 8);
-+
-             /*
--             * We need to load it.
--             * Allocate memory for the image bits.
-+             * Open the R0 image.
-              */
--            PSUPLDRLOAD pLoadReq = (PSUPLDRLOAD)RTMemTmpAlloc(SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
--            if (pLoadReq)
-+            SUPLDROPEN OpenReq;
-+            OpenReq.Hdr.u32Cookie              = g_u32Cookie;
-+            OpenReq.Hdr.u32SessionCookie       = g_u32SessionCookie;
-+            OpenReq.Hdr.cbIn                   = SUP_IOCTL_LDR_OPEN_SIZE_IN;
-+            OpenReq.Hdr.cbOut                  = SUP_IOCTL_LDR_OPEN_SIZE_OUT;
-+            OpenReq.Hdr.fFlags                 = SUPREQHDR_FLAGS_DEFAULT;
-+            OpenReq.Hdr.rc                     = VERR_INTERNAL_ERROR;
-+            OpenReq.u.In.cbImageWithEverything = cbImageWithEverything;
-+            OpenReq.u.In.cbImageBits           = (uint32_t)CalcArgs.cbImage;
-+            strcpy(OpenReq.u.In.szName, pszModule);
-+            strcpy(OpenReq.u.In.szFilename, pszFilename);
-+            if (!g_uSupFakeMode)
-+            {
-+                rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_OPEN, &OpenReq, SUP_IOCTL_LDR_OPEN_SIZE);
-+                if (RT_SUCCESS(rc))
-+                    rc = OpenReq.Hdr.rc;
-+            }
-+            else
-+            {
-+                OpenReq.u.Out.fNeedsLoading = true;
-+                OpenReq.u.Out.pvImageBase = 0xef423420;
-+            }
-+            *ppvImageBase = (void *)OpenReq.u.Out.pvImageBase;
-+            if (    RT_SUCCESS(rc)
-+                &&  OpenReq.u.Out.fNeedsLoading)
-             {
-                 /*
--                 * Get the image bits.
-+                 * We need to load it.
-+                 *
-+                 * Allocate the request and pass it to an inner work function
-+                 * that populates it and sends it off to the driver.
-                  */
--
--                SUPLDRRESIMPARGS Args = { pszModule, pErrInfo };
--                rc = RTLdrGetBits(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                  supLoadModuleResolveImport, &Args);
--
--                if (RT_SUCCESS(rc))
-+                const uint32_t cbLoadReq = SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithEverything);
-+                PSUPLDRLOAD    pLoadReq  = (PSUPLDRLOAD)RTMemTmpAlloc(cbLoadReq);
-+                if (pLoadReq)
-                 {
--                    /*
--                     * Get the entry points.
--                     */
--                    RTUINTPTR VMMR0EntryFast = 0;
--                    RTUINTPTR VMMR0EntryEx = 0;
--                    RTUINTPTR SrvReqHandler = 0;
--                    RTUINTPTR ModuleInit = 0;
--                    RTUINTPTR ModuleTerm = 0;
--                    const char *pszEp = NULL;
--                    if (fIsVMMR0)
--                    {
--                        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                              UINT32_MAX, pszEp = "VMMR0EntryFast", &VMMR0EntryFast);
--                        if (RT_SUCCESS(rc))
--                            rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                                  UINT32_MAX, pszEp = "VMMR0EntryEx", &VMMR0EntryEx);
--                    }
--                    else if (pszSrvReqHandler)
--                        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                              UINT32_MAX, pszEp = pszSrvReqHandler, &SrvReqHandler);
--                    if (RT_SUCCESS(rc))
--                    {
--                        int rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                                   UINT32_MAX, pszEp = "ModuleInit", &ModuleInit);
--                        if (RT_FAILURE(rc2))
--                            ModuleInit = 0;
--
--                        rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
--                                               UINT32_MAX, pszEp = "ModuleTerm", &ModuleTerm);
--                        if (RT_FAILURE(rc2))
--                            ModuleTerm = 0;
--                    }
--                    if (RT_SUCCESS(rc))
--                    {
--                        /*
--                         * Create the symbol and string tables.
--                         */
--                        SUPLDRCREATETABSARGS CreateArgs;
--                        CreateArgs.cbImage = CalcArgs.cbImage;
--                        CreateArgs.pSym    = (PSUPLDRSYM)&pLoadReq->u.In.abImage[offSymTab];
--                        CreateArgs.pszBase =     (char *)&pLoadReq->u.In.abImage[offStrTab];
--                        CreateArgs.psz     = CreateArgs.pszBase;
--                        rc = RTLdrEnumSymbols(hLdrMod, 0, NULL, 0, supLoadModuleCreateTabsCB, &CreateArgs);
--                        if (RT_SUCCESS(rc))
--                        {
--                            AssertRelease((size_t)(CreateArgs.psz - CreateArgs.pszBase) <= CalcArgs.cbStrings);
--                            AssertRelease((size_t)(CreateArgs.pSym - (PSUPLDRSYM)&pLoadReq->u.In.abImage[offSymTab]) <= CalcArgs.cSymbols);
--
--                            /*
--                             * Upload the image.
--                             */
--                            pLoadReq->Hdr.u32Cookie = g_u32Cookie;
--                            pLoadReq->Hdr.u32SessionCookie = g_u32SessionCookie;
--                            pLoadReq->Hdr.cbIn = SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImageWithTabs);
--                            pLoadReq->Hdr.cbOut = SUP_IOCTL_LDR_LOAD_SIZE_OUT;
--                            pLoadReq->Hdr.fFlags = SUPREQHDR_FLAGS_MAGIC | SUPREQHDR_FLAGS_EXTRA_IN;
--                            pLoadReq->Hdr.rc = VERR_INTERNAL_ERROR;
--
--                            pLoadReq->u.In.pfnModuleInit              = (RTR0PTR)ModuleInit;
--                            pLoadReq->u.In.pfnModuleTerm              = (RTR0PTR)ModuleTerm;
--                            if (fIsVMMR0)
--                            {
--                                pLoadReq->u.In.eEPType                = SUPLDRLOADEP_VMMR0;
--                                pLoadReq->u.In.EP.VMMR0.pvVMMR0       = OpenReq.u.Out.pvImageBase;
--                                pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryFast= (RTR0PTR)VMMR0EntryFast;
--                                pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryEx  = (RTR0PTR)VMMR0EntryEx;
--                            }
--                            else if (pszSrvReqHandler)
--                            {
--                                pLoadReq->u.In.eEPType                = SUPLDRLOADEP_SERVICE;
--                                pLoadReq->u.In.EP.Service.pfnServiceReq = (RTR0PTR)SrvReqHandler;
--                                pLoadReq->u.In.EP.Service.apvReserved[0] = NIL_RTR0PTR;
--                                pLoadReq->u.In.EP.Service.apvReserved[1] = NIL_RTR0PTR;
--                                pLoadReq->u.In.EP.Service.apvReserved[2] = NIL_RTR0PTR;
--                            }
--                            else
--                                pLoadReq->u.In.eEPType                = SUPLDRLOADEP_NOTHING;
--                            pLoadReq->u.In.offStrTab                  = offStrTab;
--                            pLoadReq->u.In.cbStrTab                   = (uint32_t)CalcArgs.cbStrings;
--                            AssertRelease(pLoadReq->u.In.cbStrTab == CalcArgs.cbStrings);
--                            pLoadReq->u.In.cbImageBits                = (uint32_t)CalcArgs.cbImage;
--                            pLoadReq->u.In.offSymbols                 = offSymTab;
--                            pLoadReq->u.In.cSymbols                   = CalcArgs.cSymbols;
--                            pLoadReq->u.In.cbImageWithTabs            = cbImageWithTabs;
--                            pLoadReq->u.In.pvImageBase                = OpenReq.u.Out.pvImageBase;
--                            if (!g_uSupFakeMode)
--                            {
--                                rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_LOAD, pLoadReq, SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
--                                if (RT_SUCCESS(rc))
--                                    rc = pLoadReq->Hdr.rc;
--                                else
--                                    LogRel(("SUP: SUP_IOCTL_LDR_LOAD ioctl for %s (%s) failed rc=%Rrc\n", pszModule, pszFilename, rc));
--                            }
--                            else
--                                rc = VINF_SUCCESS;
--                            if (    RT_SUCCESS(rc)
--                                ||  rc == VERR_ALREADY_LOADED /* A competing process. */
--                               )
--                            {
--                                LogRel(("SUP: Loaded %s (%s) at %#RKv - ModuleInit at %RKv and ModuleTerm at %RKv%s\n",
--                                        pszModule, pszFilename, OpenReq.u.Out.pvImageBase, (RTR0PTR)ModuleInit, (RTR0PTR)ModuleTerm,
--                                        OpenReq.u.Out.fNativeLoader ? " using the native ring-0 loader" : ""));
--                                if (fIsVMMR0)
--                                {
--                                    g_pvVMMR0 = OpenReq.u.Out.pvImageBase;
--                                    LogRel(("SUP: VMMR0EntryEx located at %RKv and VMMR0EntryFast at %RKv\n", (RTR0PTR)VMMR0EntryEx, (RTR0PTR)VMMR0EntryFast));
--                                }
--#ifdef RT_OS_WINDOWS
--                                LogRel(("SUP: windbg> .reload /f %s=%#RKv\n", pszFilename, OpenReq.u.Out.pvImageBase));
--#endif
--
--                                RTMemTmpFree(pLoadReq);
--                                RTLdrClose(hLdrMod);
--                                return VINF_SUCCESS;
--                            }
--
--                            /*
--                             * Failed, bail out.
--                             */
--                            LogRel(("SUP: Loading failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
--                            if (   pLoadReq->u.Out.uErrorMagic == SUPLDRLOAD_ERROR_MAGIC
--                                && pLoadReq->u.Out.szError[0] != '\0')
--                            {
--                                LogRel(("SUP: %s\n", pLoadReq->u.Out.szError));
--                                RTErrInfoSet(pErrInfo, rc, pLoadReq->u.Out.szError);
--                            }
--                            else
--                                RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_LOAD failed");
--                        }
--                        else
--                        {
--                            LogRel(("SUP: RTLdrEnumSymbols failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
--                            RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSymbols #2 failed");
--                        }
--                    }
--                    else
--                    {
--                        LogRel(("SUP: Failed to get entry point '%s' for %s (%s) rc=%Rrc\n", pszEp, pszModule, pszFilename, rc));
--                        RTErrInfoSetF(pErrInfo, rc, "Failed to resolve entry point '%s'", pszEp);
--                    }
-+                    rc = supLoadModuleInner(hLdrMod, pLoadReq, cbImageWithEverything, OpenReq.u.Out.pvImageBase, CalcArgs.cbImage,
-+                                            pszModule, pszFilename, OpenReq.u.Out.fNativeLoader, fIsVMMR0, pszSrvReqHandler,
-+                                            offSymTab, CalcArgs.cSymbols,
-+                                            offStrTab, CalcArgs.cbStrings,
-+                                            offSegTab, SegArgs.iSegs,
-+                                            pErrInfo);
-+                    RTMemTmpFree(pLoadReq);
-                 }
-                 else
-                 {
--                    LogRel(("SUP: RTLdrGetBits failed for %s (%s). rc=%Rrc\n", pszModule, pszFilename, rc));
--                    if (!RTErrInfoIsSet(pErrInfo))
--                        RTErrInfoSetF(pErrInfo, rc, "RTLdrGetBits failed");
-+                    AssertMsgFailed(("failed to allocated %u bytes for SUPLDRLOAD_IN structure!\n", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithEverything)));
-+                    rc = RTErrInfoSetF(pErrInfo, VERR_NO_TMP_MEMORY, "Failed to allocate %u bytes for the load request",
-+                                       SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithEverything));
-                 }
--                RTMemTmpFree(pLoadReq);
-             }
--            else
-+            /*
-+             * Already loaded?
-+             */
-+            else if (RT_SUCCESS(rc))
-             {
--                AssertMsgFailed(("failed to allocated %u bytes for SUPLDRLOAD_IN structure!\n", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs)));
--                rc = VERR_NO_TMP_MEMORY;
--                RTErrInfoSetF(pErrInfo, rc, "Failed to allocate %u bytes for the load request", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
--            }
--        }
--        /*
--         * Already loaded?
--         */
--        else if (RT_SUCCESS(rc))
--        {
--            if (fIsVMMR0)
--                g_pvVMMR0 = OpenReq.u.Out.pvImageBase;
--            LogRel(("SUP: Opened %s (%s) at %#RKv%s.\n", pszModule, pszFilename, OpenReq.u.Out.pvImageBase,
--                    OpenReq.u.Out.fNativeLoader ? " loaded by the native ring-0 loader" : ""));
-+                if (fIsVMMR0)
-+                    g_pvVMMR0 = OpenReq.u.Out.pvImageBase;
-+                LogRel(("SUP: Opened %s (%s) at %#RKv%s.\n", pszModule, pszFilename, OpenReq.u.Out.pvImageBase,
-+                        OpenReq.u.Out.fNativeLoader ? " loaded by the native ring-0 loader" : ""));
- #ifdef RT_OS_WINDOWS
--            LogRel(("SUP: windbg> .reload /f %s=%#RKv\n", pszFilename, OpenReq.u.Out.pvImageBase));
-+                LogRel(("SUP: windbg> .reload /f %s=%#RKv\n", pszFilename, OpenReq.u.Out.pvImageBase));
- #endif
-+            }
-+            /*
-+             * No, failed.
-+             */
-+            else
-+                RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_OPEN failed");
-         }
--        /*
--         * No, failed.
--         */
--        else
--            RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_OPEN failed");
-+        else if (!RTErrInfoIsSet(pErrInfo) && pErrInfo)
-+            RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSegments #1 failed");
-     }
-     else
-         RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSymbols #1 failed");
-@@ -682,10 +928,10 @@ SUPR3DECL(int) SUPR3GetSymbolR0(void *pv
- }
- 
- 
--SUPR3DECL(int) SUPR3LoadVMM(const char *pszFilename)
-+SUPR3DECL(int) SUPR3LoadVMM(const char *pszFilename, PRTERRINFO pErrInfo)
- {
-     void *pvImageBase;
--    return SUPR3LoadModule(pszFilename, "VMMR0.r0", &pvImageBase, NULL /*pErrInfo*/);
-+    return SUPR3LoadModule(pszFilename, "VMMR0.r0", &pvImageBase, pErrInfo);
- }
- 
- 
---- a/src/VBox/HostDrivers/Support/testcase/tstInt.cpp
-+++ b/src/VBox/HostDrivers/Support/testcase/tstInt.cpp
-@@ -76,7 +76,8 @@ int main(int argc, char **argv)
-         /*
-          * Load VMM code.
-          */
--        rc = SUPR3LoadVMM(szAbsFile);
-+        RTERRINFOSTATIC ErrInfo;
-+        rc = SUPR3LoadVMM(szAbsFile, RTErrInfoInitStatic(&ErrInfo));
-         if (RT_SUCCESS(rc))
-         {
-             /*
-@@ -208,7 +209,7 @@ int main(int argc, char **argv)
-         }
-         else
-         {
--            RTPrintf("tstInt: SUPR3LoadVMM failed with rc=%Rrc\n", rc);
-+            RTPrintf("tstInt: SUPR3LoadVMM failed with rc=%Rrc%#RTeim\n", rc, &ErrInfo.Core);
-             rcRet++;
-         }
- 
---- a/src/VBox/Devices/Makefile.kmk
-+++ b/src/VBox/Devices/Makefile.kmk
-@@ -52,7 +52,7 @@ if !defined(VBOX_ONLY_EXTPACKS)
-  if1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS))
-   LIBRARIES += ServicesR0
-   DLLS      += VBoxDDU VBoxDD VBoxDD2
--  SYSMODS   += VBoxDDR0
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxDDR0
-   ifdef VBOX_WITH_RAW_MODE
-    SYSMODS   += VBoxDDRC
-   endif
-@@ -1370,7 +1370,7 @@ if defined(VBOX_WITH_EXTPACK) && defined
- 	USB/DevXHCI.cpp
-   $(call VBOX_SET_VER_INFO_DLL,VBoxEhciR3,PUEL Extension Pack - EHCI Device)
- 
--  SYSMODS += VBoxEhciR0
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxEhciR0
-   VBoxEhciR0_TEMPLATE = VBoxR0ExtPackPuel
-   VBoxEhciR0_SOURCES  = \
- 	USB/DevEHCI.cpp \
-@@ -1406,7 +1406,7 @@ if defined(VBOX_WITH_EXTPACK) && defined
-   VBoxPciRawDrv_SOURCES     = Bus/DrvPciRaw.cpp
-   $(call VBOX_SET_VER_INFO_DLL,VBoxPciRawDrv,PUEL Extension Pack - PCI Passthrough Driver)
- 
--  SYSMODS += VBoxPciRawR0
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxPciRawR0
-   VBoxPciRawR0_TEMPLATE     = VBoxR0ExtPackPuel
-   VBoxPciRawR0_SOURCES      = Bus/DevPciRaw.cpp
-   $(call VBOX_SET_VER_INFO_R0,VBoxPciRawR0,PUEL Extension Pack - PCI Passthrough Driver$(COMMA) ring-0)
-@@ -1424,7 +1424,7 @@ if defined(VBOX_WITH_EXTPACK) && defined
-   	Storage/DevNVMe.cpp
-   $(call VBOX_SET_VER_INFO_DLL,VBoxNvmeR3,PUEL Extension Pack - NVMe Device)
- 
--  SYSMODS += VBoxNvmeR0
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxNvmeR0
-   VBoxNvmeR0_TEMPLATE = VBoxR0ExtPackPuel
-   VBoxNvmeR0_SOURCES  = \
-   	Storage/DevNVMe.cpp
---- a/src/VBox/ExtPacks/VBoxDTrace/Makefile.kmk
-+++ b/src/VBox/ExtPacks/VBoxDTrace/Makefile.kmk
-@@ -242,7 +242,7 @@ if defined(VBOX_WITH_EXTPACK_VBOXDTRACE)
-  # The ring-0 part of VBoxDTrace.
-  #
-  ifneq ($(KBUILD_TARGET),solaris) # disabled on solaris - neiter needed nor currently able to build it here.
--  SYSMODS += VBoxDTraceR0
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxDTraceR0
-  endif
-  VBoxDTraceR0_TEMPLATE = VBoxR0ExtPackDTrace
-  VBoxDTraceR0_DEFS = IN_VBOXDTRACE_R0 IN_RT_R0
---- a/src/VBox/ExtPacks/BusMouseSample/Makefile.kmk
-+++ b/src/VBox/ExtPacks/BusMouseSample/Makefile.kmk
-@@ -83,7 +83,7 @@ DLLS += VBoxBusMouseR3
- VBoxBusMouseR3_TEMPLATE = VBoxR3ExtPackBusMouse
- VBoxBusMouseR3_SOURCES  = DevBusMouse.cpp
- 
--SYSMODS += VBoxBusMouseR0
-+$(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VBoxBusMouseR0
- VBoxBusMouseR0_TEMPLATE = VBoxR0ExtPackBusMouse
- VBoxBusMouseR0_SOURCES  = DevBusMouse.cpp
- 
---- a/src/VBox/Runtime/testcase/Makefile.kmk
-+++ b/src/VBox/Runtime/testcase/Makefile.kmk
-@@ -210,13 +210,13 @@ if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
-   	tstRTR0ThreadDriver
-  endif
-  if1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS))
--  SYSMODS += \
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += \
-   	tstLdrObjR0
-   ifdef VBOX_WITH_RAW_MODE
-    SYSMODS += tstLdrObj
-   endif
-  endif
-- SYSMODS += \
-+ $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += \
-  	tstRTR0MemUserKernel \
-  	tstRTR0SemMutex \
-  	tstRTR0Timer \
-@@ -224,7 +224,7 @@ if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
-  	tstRTR0Thread
-  if1of ($(KBUILD_TARGET), solaris darwin)
-   PROGRAMS += tstRTR0DbgKrnlInfoDriver
--  SYSMODS += tstRTR0DbgKrnlInfo
-+  $(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += tstRTR0DbgKrnlInfo
-  endif # VBOX_SUPPORTED_HOST_ARCHS only
- 
- endif
---- a/src/VBox/VMM/Makefile.kmk
-+++ b/src/VBox/VMM/Makefile.kmk
-@@ -435,7 +435,7 @@ ifndef VBOX_ONLY_EXTPACKS
- #
- # VMMR0.r0
- #
--SYSMODS += VMMR0
-+$(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += VMMR0
- VMMR0_TEMPLATE  = VBoxR0
- VMMR0_SYSSUFF   = .r0
- 
---- a/src/VBox/ValidationKit/utils/misc/Makefile.kmk
-+++ b/src/VBox/ValidationKit/utils/misc/Makefile.kmk
-@@ -31,7 +31,7 @@ PROGRAMS += LoadGenerator
- LoadGenerator_TEMPLATE = VBoxValidationKitR3Host
- LoadGenerator_SOURCES  = loadgenerator.cpp
- 
--SYSMODS += loadgeneratorR0
-+$(if-expr defined(VBOX_WITH_VBOXR0_AS_DLL),DLLS,SYSMODS) += loadgeneratorR0
- loadgeneratorR0_TEMPLATE = VBoxValidationKitR0
- loadgeneratorR0_SOURCES = loadgeneratorR0.cpp
- 
---- a/src/VBox/HostDrivers/Support/SUPLib.cpp
-+++ b/src/VBox/HostDrivers/Support/SUPLib.cpp
-@@ -275,9 +275,9 @@ SUPR3DECL(int) SUPR3InitEx(bool fUnrestr
-         CookieReq.Hdr.rc = VERR_INTERNAL_ERROR;
-         strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC);
-         CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION;
--        const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x002d0000
-+        const uint32_t uMinVersion = /*(SUPDRV_IOC_VERSION & 0xffff0000) == 0x002d0000
-                                    ? 0x002d0001
--                                   : SUPDRV_IOC_VERSION & 0xffff0000;
-+                                   :*/ SUPDRV_IOC_VERSION & 0xffff0000;
-         CookieReq.u.In.u32MinVersion = uMinVersion;
-         rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_COOKIE, &CookieReq, SUP_IOCTL_COOKIE_SIZE);
-         if (    RT_SUCCESS(rc)
---- a/src/VBox/HostDrivers/Support/SUPDrvIOC.h
-+++ b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
-@@ -220,9 +220,10 @@ typedef SUPREQHDR *PSUPREQHDR;
-  *  -# When increment the major number, execute all pending work.
-  *
-  * @todo Pending work on next major version change:
-- *          - Move SUP_IOCTL_FAST_DO_NOP and SUP_VMMR0_DO_NEM_RUN after NEM.
-+ *          - Nothing.
-+ * @note 0x002f0000 is used by 6.0. The next version number must be 0x00300000.
-  */
--#define SUPDRV_IOC_VERSION                              0x002d0001
-+#define SUPDRV_IOC_VERSION                              0x002e0000
- 
- /** SUP_IOCTL_COOKIE. */
- typedef struct SUPCOOKIE
-@@ -314,8 +315,8 @@ typedef struct SUPLDROPEN
-     {
-         struct
-         {
--            /** Size of the image we'll be loading (including tables). */
--            uint32_t        cbImageWithTabs;
-+            /** Size of the image we'll be loading (including all tables). */
-+            uint32_t        cbImageWithEverything;
-             /** The size of the image bits. (Less or equal to cbImageWithTabs.) */
-             uint32_t        cbImageBits;
-             /** Image name.
-@@ -390,6 +391,29 @@ typedef SUPLDRSYM *PSUPLDRSYM;
- /** Pointer to a const symbol table entry. */
- typedef SUPLDRSYM const *PCSUPLDRSYM;
- 
-+#define SUPLDR_PROT_READ    1   /**< Grant read access (RTMEM_PROT_READ). */
-+#define SUPLDR_PROT_WRITE   2   /**< Grant write access (RTMEM_PROT_WRITE). */
-+#define SUPLDR_PROT_EXEC    4   /**< Grant execute access (RTMEM_PROT_EXEC). */
-+
-+/**
-+ * A segment table entry - chiefly for conveying memory protection.
-+ */
-+typedef struct SUPLDRSEG
-+{
-+    /** The RVA of the segment. */
-+    uint32_t        off;
-+    /** The size of the segment. */
-+    uint32_t        cb : 28;
-+    /** The segment protection (SUPLDR_PROT_XXX). */
-+    uint32_t        fProt : 3;
-+    /** MBZ. */
-+    uint32_t        fUnused;
-+} SUPLDRSEG;
-+/** Pointer to a segment table entry. */
-+typedef SUPLDRSEG *PSUPLDRSEG;
-+/** Pointer to a const segment table entry. */
-+typedef SUPLDRSEG const *PCSUPLDRSEG;
-+
- /**
-  * SUPLDRLOAD::u::In::EP type.
-  */
-@@ -443,7 +467,7 @@ typedef struct SUPLDRLOAD
-             /** The size of the image bits (starting at offset 0 and
-              * approaching offSymbols). */
-             uint32_t        cbImageBits;
--            /** The offset of the symbol table. */
-+            /** The offset of the symbol table (SUPLDRSYM array). */
-             uint32_t        offSymbols;
-             /** The number of entries in the symbol table. */
-             uint32_t        cSymbols;
-@@ -451,8 +475,12 @@ typedef struct SUPLDRLOAD
-             uint32_t        offStrTab;
-             /** Size of the string table. */
-             uint32_t        cbStrTab;
-+            /** Offset to the segment table (SUPLDRSEG array). */
-+            uint32_t        offSegments;
-+            /** Number of segments. */
-+            uint32_t        cSegments;
-             /** Size of image data in achImage. */
--            uint32_t        cbImageWithTabs;
-+            uint32_t        cbImageWithEverything;
-             /** The image data. */
-             uint8_t         abImage[1];
-         } In;
---- a/src/VBox/HostDrivers/Support/SUPDrvInternal.h
-+++ b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
-@@ -145,6 +145,12 @@
- # define SUPDRV_USE_MUTEX_FOR_GIP
- #endif
- 
-+#if defined(RT_OS_LINUX) /** @todo make everyone do this */
-+/** Use the RTR0MemObj API rather than the RTMemExecAlloc for the images.
-+ * This is a good idea in general, but a necessity for @bugref{9801}. */
-+# define SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+#endif
-+
- 
- /**
-  * OS debug print macro.
-@@ -326,15 +332,20 @@ typedef struct SUPDRVLDRIMAGE
-     struct SUPDRVLDRIMAGE * volatile pNext;
-     /** Pointer to the image. */
-     void                           *pvImage;
-+#ifdef SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+    /** The memory object for the module allocation. */
-+    RTR0MEMOBJ                      hMemObjImage;
-+#else
-     /** Pointer to the allocated image buffer.
-      * pvImage is 32-byte aligned or it may governed by the native loader (this
-      * member is NULL then). */
-     void                           *pvImageAlloc;
-+#endif
-     /** Magic value (SUPDRVLDRIMAGE_MAGIC). */
-     uint32_t                        uMagic;
-     /** Size of the image including the tables. This is mainly for verification
-      * of the load request. */
--    uint32_t                        cbImageWithTabs;
-+    uint32_t                        cbImageWithEverything;
-     /** Size of the image. */
-     uint32_t                        cbImageBits;
-     /** The number of entries in the symbol table. */
-@@ -345,6 +356,10 @@ typedef struct SUPDRVLDRIMAGE
-     char                           *pachStrTab;
-     /** Size of the string table. */
-     uint32_t                        cbStrTab;
-+    /** Number of segments. */
-+    uint32_t                        cSegments;
-+    /** Segments (for memory protection). */
-+    PSUPLDRSEG                      paSegments;
-     /** Pointer to the optional module initialization callback. */
-     PFNR0MODULEINIT                 pfnModuleInit;
-     /** Pointer to the optional module termination callback. */
---- a/src/VBox/HostDrivers/Support/SUPDrv.cpp
-+++ b/src/VBox/HostDrivers/Support/SUPDrv.cpp
-@@ -1734,11 +1734,10 @@ static int supdrvIOCtlInnerUnrestricted(
-             /* validate */
-             PSUPLDROPEN pReq = (PSUPLDROPEN)pReqHdr;
-             REQ_CHECK_SIZES(SUP_IOCTL_LDR_OPEN);
--            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageWithTabs > 0);
--            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageWithTabs < 16*_1M);
-+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageWithEverything > 0);
-+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageWithEverything < 16*_1M);
-             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageBits > 0);
--            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageBits > 0);
--            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageBits < pReq->u.In.cbImageWithTabs);
-+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageBits < pReq->u.In.cbImageWithEverything);
-             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.szName[0]);
-             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, RTStrEnd(pReq->u.In.szName, sizeof(pReq->u.In.szName)));
-             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, supdrvIsLdrModuleNameValid(pReq->u.In.szName));
-@@ -1754,19 +1753,29 @@ static int supdrvIOCtlInnerUnrestricted(
-             /* validate */
-             PSUPLDRLOAD pReq = (PSUPLDRLOAD)pReqHdr;
-             REQ_CHECK_EXPR(Name, pReq->Hdr.cbIn >= SUP_IOCTL_LDR_LOAD_SIZE_IN(32));
--            REQ_CHECK_SIZES_EX(SUP_IOCTL_LDR_LOAD, SUP_IOCTL_LDR_LOAD_SIZE_IN(pReq->u.In.cbImageWithTabs), SUP_IOCTL_LDR_LOAD_SIZE_OUT);
--            REQ_CHECK_EXPR(SUP_IOCTL_LDR_LOAD, pReq->u.In.cSymbols <= 16384);
-+            REQ_CHECK_SIZES_EX(SUP_IOCTL_LDR_LOAD, SUP_IOCTL_LDR_LOAD_SIZE_IN(pReq->u.In.cbImageWithEverything), SUP_IOCTL_LDR_LOAD_SIZE_OUT);
-             REQ_CHECK_EXPR_FMT(     !pReq->u.In.cSymbols
--                               ||   (   pReq->u.In.offSymbols < pReq->u.In.cbImageWithTabs
--                                     && pReq->u.In.offSymbols + pReq->u.In.cSymbols * sizeof(SUPLDRSYM) <= pReq->u.In.cbImageWithTabs),
--                               ("SUP_IOCTL_LDR_LOAD: offSymbols=%#lx cSymbols=%#lx cbImageWithTabs=%#lx\n", (long)pReq->u.In.offSymbols,
--                                (long)pReq->u.In.cSymbols, (long)pReq->u.In.cbImageWithTabs));
-+                               ||   (   pReq->u.In.cSymbols <= 16384
-+                                     && pReq->u.In.offSymbols >= pReq->u.In.cbImageBits
-+                                     && pReq->u.In.offSymbols < pReq->u.In.cbImageWithEverything
-+                                     && pReq->u.In.offSymbols + pReq->u.In.cSymbols * sizeof(SUPLDRSYM) <= pReq->u.In.cbImageWithEverything),
-+                               ("SUP_IOCTL_LDR_LOAD: offSymbols=%#lx cSymbols=%#lx cbImageWithEverything=%#lx\n", (long)pReq->u.In.offSymbols,
-+                                (long)pReq->u.In.cSymbols, (long)pReq->u.In.cbImageWithEverything));
-             REQ_CHECK_EXPR_FMT(     !pReq->u.In.cbStrTab
--                               ||   (   pReq->u.In.offStrTab < pReq->u.In.cbImageWithTabs
--                                     && pReq->u.In.offStrTab + pReq->u.In.cbStrTab <= pReq->u.In.cbImageWithTabs
--                                     && pReq->u.In.cbStrTab <= pReq->u.In.cbImageWithTabs),
--                               ("SUP_IOCTL_LDR_LOAD: offStrTab=%#lx cbStrTab=%#lx cbImageWithTabs=%#lx\n", (long)pReq->u.In.offStrTab,
--                                (long)pReq->u.In.cbStrTab, (long)pReq->u.In.cbImageWithTabs));
-+                               ||   (   pReq->u.In.offStrTab < pReq->u.In.cbImageWithEverything
-+                                     && pReq->u.In.offStrTab >= pReq->u.In.cbImageBits
-+                                     && pReq->u.In.offStrTab + pReq->u.In.cbStrTab <= pReq->u.In.cbImageWithEverything
-+                                     && pReq->u.In.cbStrTab <= pReq->u.In.cbImageWithEverything),
-+                               ("SUP_IOCTL_LDR_LOAD: offStrTab=%#lx cbStrTab=%#lx cbImageWithEverything=%#lx\n", (long)pReq->u.In.offStrTab,
-+                                (long)pReq->u.In.cbStrTab, (long)pReq->u.In.cbImageWithEverything));
-+            REQ_CHECK_EXPR_FMT(   pReq->u.In.cSegments >= 1
-+                               && pReq->u.In.cSegments <= 128
-+                               && pReq->u.In.cSegments <= pReq->u.In.cbImageBits / PAGE_SIZE
-+                               && pReq->u.In.offSegments >= pReq->u.In.cbImageBits
-+                               && pReq->u.In.offSegments < pReq->u.In.cbImageWithEverything
-+                               && pReq->u.In.offSegments + pReq->u.In.cSegments * sizeof(SUPLDRSEG) <= pReq->u.In.cbImageWithEverything,
-+                               ("SUP_IOCTL_LDR_LOAD: offSegments=%#lx cSegments=%#lx cbImageWithEverything=%#lx\n", (long)pReq->u.In.offSegments,
-+                                (long)pReq->u.In.cSegments, (long)pReq->u.In.cbImageWithEverything));
- 
-             if (pReq->u.In.cSymbols)
-             {
-@@ -1774,15 +1783,37 @@ static int supdrvIOCtlInnerUnrestricted(
-                 PSUPLDRSYM paSyms = (PSUPLDRSYM)&pReq->u.In.abImage[pReq->u.In.offSymbols];
-                 for (i = 0; i < pReq->u.In.cSymbols; i++)
-                 {
--                    REQ_CHECK_EXPR_FMT(paSyms[i].offSymbol < pReq->u.In.cbImageWithTabs,
--                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: symb off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offSymbol, (long)pReq->u.In.cbImageWithTabs));
-+                    REQ_CHECK_EXPR_FMT(paSyms[i].offSymbol < pReq->u.In.cbImageWithEverything,
-+                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: symb off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offSymbol, (long)pReq->u.In.cbImageWithEverything));
-                     REQ_CHECK_EXPR_FMT(paSyms[i].offName < pReq->u.In.cbStrTab,
--                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: name off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithTabs));
-+                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: name off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithEverything));
-                     REQ_CHECK_EXPR_FMT(RTStrEnd((char const *)&pReq->u.In.abImage[pReq->u.In.offStrTab + paSyms[i].offName],
-                                                 pReq->u.In.cbStrTab - paSyms[i].offName),
--                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: unterminated name! (%#lx / %#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithTabs));
-+                                       ("SUP_IOCTL_LDR_LOAD: sym #%ld: unterminated name! (%#lx / %#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithEverything));
-                 }
-             }
-+            {
-+                uint32_t i;
-+                uint32_t offPrevEnd = 0;
-+                PSUPLDRSEG paSegs = (PSUPLDRSEG)&pReq->u.In.abImage[pReq->u.In.offSegments];
-+                for (i = 0; i < pReq->u.In.cSegments; i++)
-+                {
-+                    REQ_CHECK_EXPR_FMT(paSegs[i].off < pReq->u.In.cbImageBits && !(paSegs[i].off & PAGE_OFFSET_MASK),
-+                                       ("SUP_IOCTL_LDR_LOAD: seg #%ld: off %#lx (max=%#lx)\n", (long)i, (long)paSegs[i].off, (long)pReq->u.In.cbImageBits));
-+                    REQ_CHECK_EXPR_FMT(paSegs[i].cb <= pReq->u.In.cbImageBits,
-+                                       ("SUP_IOCTL_LDR_LOAD: seg #%ld: cb %#lx (max=%#lx)\n", (long)i, (long)paSegs[i].cb, (long)pReq->u.In.cbImageBits));
-+                    REQ_CHECK_EXPR_FMT(paSegs[i].off + paSegs[i].cb <= pReq->u.In.cbImageBits,
-+                                       ("SUP_IOCTL_LDR_LOAD: seg #%ld: off %#lx + cb %#lx = %#lx (max=%#lx)\n", (long)i, (long)paSegs[i].off, (long)paSegs[i].cb, (long)(paSegs[i].off + paSegs[i].cb), (long)pReq->u.In.cbImageBits));
-+                    REQ_CHECK_EXPR_FMT(paSegs[i].fProt != 0,
-+                                       ("SUP_IOCTL_LDR_LOAD: seg #%ld: off %#lx + cb %#lx\n", (long)i, (long)paSegs[i].off, (long)paSegs[i].cb));
-+                    REQ_CHECK_EXPR_FMT(paSegs[i].fUnused == 0, ("SUP_IOCTL_LDR_LOAD: seg #%ld: fUnused=1\n", (long)i));
-+                    REQ_CHECK_EXPR_FMT(offPrevEnd == paSegs[i].off,
-+                                       ("SUP_IOCTL_LDR_LOAD: seg #%ld: off %#lx offPrevEnd %#lx\n", (long)i, (long)paSegs[i].off, (long)offPrevEnd));
-+                    offPrevEnd = paSegs[i].off + paSegs[i].cb;
-+                }
-+                REQ_CHECK_EXPR_FMT(offPrevEnd == pReq->u.In.cbImageBits,
-+                                   ("SUP_IOCTL_LDR_LOAD: offPrevEnd %#lx cbImageBits %#lx\n", (long)i, (long)offPrevEnd, (long)pReq->u.In.cbImageBits));
-+            }
- 
-             /* execute */
-             pReq->Hdr.rc = supdrvIOCtl_LdrLoad(pDevExt, pSession, pReq);
-@@ -5021,7 +5052,7 @@ static int supdrvIOCtl_LdrOpen(PSUPDRVDE
-     size_t          cchName = strlen(pReq->u.In.szName); /* (caller checked < 32). */
-     SUPDRV_CHECK_SMAP_SETUP();
-     SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
--    LogFlow(("supdrvIOCtl_LdrOpen: szName=%s cbImageWithTabs=%d\n", pReq->u.In.szName, pReq->u.In.cbImageWithTabs));
-+    LogFlow(("supdrvIOCtl_LdrOpen: szName=%s cbImageWithEverything=%d\n", pReq->u.In.szName, pReq->u.In.cbImageWithEverything));
- 
-     /*
-      * Check if we got an instance of the image already.
-@@ -5035,7 +5066,8 @@ static int supdrvIOCtl_LdrOpen(PSUPDRVDE
-         {
-             if (RT_LIKELY(pImage->cUsage < UINT32_MAX / 2U))
-             {
--                /** @todo check cbImageBits and cbImageWithTabs here, if they differs that indicates that the images are different. */
-+                /** @todo check cbImageBits and cbImageWithEverything here, if they differs
-+                 *        that indicates that the images are different. */
-                 pImage->cUsage++;
-                 pReq->u.Out.pvImageBase   = pImage->pvImage;
-                 pReq->u.Out.fNeedsLoading = pImage->uState == SUP_IOCTL_LDR_OPEN;
-@@ -5078,13 +5110,19 @@ static int supdrvIOCtl_LdrOpen(PSUPDRVDE
-      */
-     pImage = (PSUPDRVLDRIMAGE)pv;
-     pImage->pvImage         = NULL;
-+#ifdef SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+    pImage->hMemObjImage    = NIL_RTR0MEMOBJ;
-+#else
-     pImage->pvImageAlloc    = NULL;
--    pImage->cbImageWithTabs = pReq->u.In.cbImageWithTabs;
-+#endif
-+    pImage->cbImageWithEverything = pReq->u.In.cbImageWithEverything;
-     pImage->cbImageBits     = pReq->u.In.cbImageBits;
-     pImage->cSymbols        = 0;
-     pImage->paSymbols       = NULL;
-     pImage->pachStrTab      = NULL;
-     pImage->cbStrTab        = 0;
-+    pImage->cSegments       = 0;
-+    pImage->paSegments      = NULL;
-     pImage->pfnModuleInit   = NULL;
-     pImage->pfnModuleTerm   = NULL;
-     pImage->pfnServiceReqHandler = NULL;
-@@ -5102,10 +5140,19 @@ static int supdrvIOCtl_LdrOpen(PSUPDRVDE
-     rc = supdrvOSLdrOpen(pDevExt, pImage, pReq->u.In.szFilename);
-     if (rc == VERR_NOT_SUPPORTED)
-     {
-+#ifdef SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+        rc = RTR0MemObjAllocPage(&pImage->hMemObjImage, pImage->cbImageBits, true /*fExecutable*/);
-+        if (RT_SUCCESS(rc))
-+        {
-+            pImage->pvImage = RTR0MemObjAddress(pImage->hMemObjImage);
-+            pImage->fNative = false;
-+        }
-+#else
-         pImage->pvImageAlloc = RTMemExecAlloc(pImage->cbImageBits + 31);
-         pImage->pvImage     = RT_ALIGN_P(pImage->pvImageAlloc, 32);
-         pImage->fNative     = false;
-         rc = pImage->pvImageAlloc ? VINF_SUCCESS : VERR_NO_EXEC_MEMORY;
-+#endif
-         SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
-     }
-     if (RT_FAILURE(rc))
-@@ -5138,41 +5185,90 @@ static int supdrvIOCtl_LdrOpen(PSUPDRVDE
- 
- 
- /**
-+ * Formats a load error message.
-+ *
-+ * @returns @a rc
-+ * @param   rc                  Return code.
-+ * @param   pReq                The request.
-+ * @param   pszFormat           The error message format string.
-+ * @param   ...                 Argument to the format string.
-+ */
-+int VBOXCALL supdrvLdrLoadError(int rc, PSUPLDRLOAD pReq, const char *pszFormat, ...)
-+{
-+    va_list va;
-+    va_start(va, pszFormat);
-+    pReq->u.Out.uErrorMagic = SUPLDRLOAD_ERROR_MAGIC;
-+    RTStrPrintfV(pReq->u.Out.szError, sizeof(pReq->u.Out.szError), pszFormat, va);
-+    va_end(va);
-+    Log(("SUP_IOCTL_LDR_LOAD: %s [rc=%Rrc]\n", pReq->u.Out.szError, rc));
-+    return rc;
-+}
-+
-+
-+/**
-  * Worker that validates a pointer to an image entrypoint.
-  *
-+ * Calls supdrvLdrLoadError on error.
-+ *
-  * @returns IPRT status code.
-  * @param   pDevExt         The device globals.
-  * @param   pImage          The loader image.
-  * @param   pv              The pointer into the image.
-  * @param   fMayBeNull      Whether it may be NULL.
-- * @param   fCheckNative    Whether to check with the native loaders.
-- * @param   pszSymbol       The entrypoint name or log name.  If the symbol
-+ * @param   pszSymbol       The entrypoint name or log name.  If the symbol is
-  *                          capitalized it signifies a specific symbol, otherwise it
-  *                          for logging.
-  * @param   pbImageBits     The image bits prepared by ring-3.
-+ * @param   pReq            The request for passing to supdrvLdrLoadError.
-  *
-- * @remarks Will leave the lock on failure.
-+ * @note    Will leave the loader lock on failure!
-  */
- static int supdrvLdrValidatePointer(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, void *pv, bool fMayBeNull,
--                                    bool fCheckNative, const uint8_t *pbImageBits, const char *pszSymbol)
-+                                    const uint8_t *pbImageBits, const char *pszSymbol, PSUPLDRLOAD pReq)
- {
-     if (!fMayBeNull || pv)
-     {
--        if ((uintptr_t)pv - (uintptr_t)pImage->pvImage >= pImage->cbImageBits)
-+        uint32_t iSeg;
-+
-+        /* Must be within the image bits: */
-+        uintptr_t const uRva = (uintptr_t)pv - (uintptr_t)pImage->pvImage;
-+        if (uRva >= pImage->cbImageBits)
-         {
-             supdrvLdrUnlock(pDevExt);
--            Log(("Out of range (%p LB %#x): %s=%p\n", pImage->pvImage, pImage->cbImageBits, pszSymbol, pv));
--            return VERR_INVALID_PARAMETER;
-+            return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
-+                                      "Invalid entry point address %p given for %s: RVA %#zx, image size %#zx",
-+                                      pv, pszSymbol, uRva, pImage->cbImageBits);
-         }
- 
--        if (pImage->fNative && fCheckNative)
-+        /* Must be in an executable segment: */
-+        for (iSeg = 0; iSeg < pImage->cSegments; iSeg++)
-+            if (uRva - pImage->paSegments[iSeg].off < (uintptr_t)pImage->paSegments[iSeg].cb)
-+            {
-+                if (pImage->paSegments[iSeg].fProt & SUPLDR_PROT_EXEC)
-+                    break;
-+                supdrvLdrUnlock(pDevExt);
-+                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
-+                                          "Bad entry point %p given for %s: not executable (seg #%u: %#RX32 LB %#RX32 prot %#x)",
-+                                          pv, pszSymbol, iSeg, pImage->paSegments[iSeg].off, pImage->paSegments[iSeg].cb,
-+                                          pImage->paSegments[iSeg].fProt);
-+            }
-+        if (iSeg >= pImage->cSegments)
-         {
-+            supdrvLdrUnlock(pDevExt);
-+            return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
-+                                      "Bad entry point %p given for %s: no matching segment found (RVA %#zx)!",
-+                                      pv, pszSymbol, uRva);
-+        }
-+
-+        if (pImage->fNative)
-+        {
-+            /** @todo pass pReq along to the native code.   */
-             int rc = supdrvOSLdrValidatePointer(pDevExt, pImage, pv, pbImageBits, pszSymbol);
-             if (RT_FAILURE(rc))
-             {
-                 supdrvLdrUnlock(pDevExt);
--                Log(("Bad entry point address: %s=%p (rc=%Rrc)\n", pszSymbol, pv, rc));
--                return rc;
-+                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
-+                                          "Bad entry point address %p for %s: rc=%Rrc\n", pv, pszSymbol, rc);
-             }
-         }
-     }
-@@ -5223,27 +5319,6 @@ int VBOXCALL supdrvLdrLoadError(int rc,
- 
- 
- /**
-- * Formats a load error message.
-- *
-- * @returns @a rc
-- * @param   rc                  Return code.
-- * @param   pReq                The request.
-- * @param   pszFormat           The error message format string.
-- * @param   ...                 Argument to the format string.
-- */
--int VBOXCALL supdrvLdrLoadError(int rc, PSUPLDRLOAD pReq, const char *pszFormat, ...)
--{
--    va_list va;
--    va_start(va, pszFormat);
--    pReq->u.Out.uErrorMagic = SUPLDRLOAD_ERROR_MAGIC;
--    RTStrPrintfV(pReq->u.Out.szError, sizeof(pReq->u.Out.szError), pszFormat, va);
--    va_end(va);
--    Log(("SUP_IOCTL_LDR_LOAD: %s [rc=%Rrc]\n", pReq->u.Out.szError, rc));
--    return rc;
--}
--
--
--/**
-  * Loads the image bits.
-  *
-  * This is the 2nd step of the loading.
-@@ -5259,7 +5334,7 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-     PSUPDRVLDRIMAGE pImage;
-     int             rc;
-     SUPDRV_CHECK_SMAP_SETUP();
--    LogFlow(("supdrvIOCtl_LdrLoad: pvImageBase=%p cbImageWithBits=%d\n", pReq->u.In.pvImageBase, pReq->u.In.cbImageWithTabs));
-+    LogFlow(("supdrvIOCtl_LdrLoad: pvImageBase=%p cbImageWithEverything=%d\n", pReq->u.In.pvImageBase, pReq->u.In.cbImageWithEverything));
-     SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
- 
-     /*
-@@ -5281,12 +5356,12 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-     /*
-      * Validate input.
-      */
--    if (   pImage->cbImageWithTabs != pReq->u.In.cbImageWithTabs
--        || pImage->cbImageBits     != pReq->u.In.cbImageBits)
-+    if (   pImage->cbImageWithEverything != pReq->u.In.cbImageWithEverything
-+        || pImage->cbImageBits           != pReq->u.In.cbImageBits)
-     {
-         supdrvLdrUnlock(pDevExt);
--        return supdrvLdrLoadError(VERR_INVALID_HANDLE, pReq, "Image size mismatch found: %d(prep) != %d(load) or %d != %d",
--                                  pImage->cbImageWithTabs, pReq->u.In.cbImageWithTabs, pImage->cbImageBits, pReq->u.In.cbImageBits);
-+        return supdrvLdrLoadError(VERR_INVALID_HANDLE, pReq, "Image size mismatch found: %u(prep) != %u(load) or %u != %u",
-+                                  pImage->cbImageWithEverything, pReq->u.In.cbImageWithEverything, pImage->cbImageBits, pReq->u.In.cbImageBits);
-     }
- 
-     if (pImage->uState != SUP_IOCTL_LDR_OPEN)
-@@ -5306,35 +5381,56 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-         return supdrvLdrLoadError(VERR_PERMISSION_DENIED, pReq, "Loader is locked down");
-     }
- 
-+    /*
-+     * Copy the segments before we start using supdrvLdrValidatePointer for entrypoint validation.
-+     */
-+    pImage->cSegments = pReq->u.In.cSegments;
-+    {
-+        size_t  cbSegments = pImage->cSegments * sizeof(SUPLDRSEG);
-+        pImage->paSegments = (PSUPLDRSEG)RTMemDup(&pReq->u.In.abImage[pReq->u.In.offSegments], cbSegments);
-+        if (pImage->paSegments) /* Align the last segment size to avoid upsetting RTR0MemObjProtect. */ /** @todo relax RTR0MemObjProtect */
-+            pImage->paSegments[pImage->cSegments - 1].cb = RT_ALIGN_32(pImage->paSegments[pImage->cSegments - 1].cb, PAGE_SIZE);
-+        else
-+        {
-+            supdrvLdrUnlock(pDevExt);
-+            return supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for segment table: %#x", cbSegments);
-+        }
-+        SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
-+    }
-+
-+    /*
-+     * Validate entrypoints.
-+     */
-     switch (pReq->u.In.eEPType)
-     {
-         case SUPLDRLOADEP_NOTHING:
-             break;
- 
-         case SUPLDRLOADEP_VMMR0:
--            rc = supdrvLdrValidatePointer(    pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0,          false, false, pReq->u.In.abImage, "pvVMMR0");
--            if (RT_SUCCESS(rc))
--                rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryFast, false,  true, pReq->u.In.abImage, "VMMR0EntryFast");
--            if (RT_SUCCESS(rc))
--                rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryEx,   false,  true, pReq->u.In.abImage, "VMMR0EntryEx");
-+            if (pReq->u.In.EP.VMMR0.pvVMMR0 != pImage->pvImage)
-+            {
-+                supdrvLdrUnlock(pDevExt);
-+                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq, "Invalid pvVMMR0 pointer: %p, expected %p", pReq->u.In.EP.VMMR0.pvVMMR0, pImage->pvImage);
-+            }
-+            rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryFast, false, pReq->u.In.abImage, "VMMR0EntryFast", pReq);
-+            if (RT_FAILURE(rc))
-+                return rc;
-+            rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryEx,   false, pReq->u.In.abImage, "VMMR0EntryEx", pReq);
-             if (RT_FAILURE(rc))
--                return supdrvLdrLoadError(rc, pReq, "Invalid VMMR0 pointer");
-+                return rc;
-             break;
- 
-         case SUPLDRLOADEP_SERVICE:
--            rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.Service.pfnServiceReq, false,  true, pReq->u.In.abImage, "pfnServiceReq");
-+            rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.Service.pfnServiceReq, false, pReq->u.In.abImage, "pfnServiceReq", pReq);
-             if (RT_FAILURE(rc))
--                return supdrvLdrLoadError(rc, pReq, "Invalid pfnServiceReq pointer: %p", pReq->u.In.EP.Service.pfnServiceReq);
-+                return rc;
-             if (    pReq->u.In.EP.Service.apvReserved[0] != NIL_RTR0PTR
-                 ||  pReq->u.In.EP.Service.apvReserved[1] != NIL_RTR0PTR
-                 ||  pReq->u.In.EP.Service.apvReserved[2] != NIL_RTR0PTR)
-             {
-                 supdrvLdrUnlock(pDevExt);
--                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
--                                          "Out of range (%p LB %#x): apvReserved={%p,%p,%p} MBZ!",
--                                          pImage->pvImage, pReq->u.In.cbImageWithTabs,
--                                          pReq->u.In.EP.Service.apvReserved[0],
--                                          pReq->u.In.EP.Service.apvReserved[1],
-+                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq, "apvReserved={%p,%p,%p} MBZ!",
-+                                          pReq->u.In.EP.Service.apvReserved[0], pReq->u.In.EP.Service.apvReserved[1],
-                                           pReq->u.In.EP.Service.apvReserved[2]);
-             }
-             break;
-@@ -5344,12 +5440,12 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-             return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq, "Invalid eEPType=%d", pReq->u.In.eEPType);
-     }
- 
--    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleInit, true, true, pReq->u.In.abImage, "ModuleInit");
-+    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleInit, true, pReq->u.In.abImage, "ModuleInit", pReq);
-     if (RT_FAILURE(rc))
--        return supdrvLdrLoadError(rc, pReq, "Invalid pfnModuleInit pointer: %p", pReq->u.In.pfnModuleInit);
--    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleTerm, true, true, pReq->u.In.abImage, "ModuleTerm");
-+        return rc;
-+    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleTerm, true, pReq->u.In.abImage, "ModuleTerm", pReq);
-     if (RT_FAILURE(rc))
--        return supdrvLdrLoadError(rc, pReq, "Invalid pfnModuleTerm pointer: %p", pReq->u.In.pfnModuleTerm);
-+        return rc;
-     SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
- 
-     /*
-@@ -5361,10 +5457,8 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-         pImage->cbStrTab = pReq->u.In.cbStrTab;
-         if (pImage->cbStrTab)
-         {
--            pImage->pachStrTab = (char *)RTMemAlloc(pImage->cbStrTab);
--            if (pImage->pachStrTab)
--                memcpy(pImage->pachStrTab, &pReq->u.In.abImage[pReq->u.In.offStrTab], pImage->cbStrTab);
--            else
-+            pImage->pachStrTab = (char *)RTMemDup(&pReq->u.In.abImage[pReq->u.In.offStrTab], pImage->cbStrTab);
-+            if (!pImage->pachStrTab)
-                 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for string table: %#x", pImage->cbStrTab);
-             SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
-         }
-@@ -5373,17 +5467,15 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-         if (RT_SUCCESS(rc) && pImage->cSymbols)
-         {
-             size_t  cbSymbols = pImage->cSymbols * sizeof(SUPLDRSYM);
--            pImage->paSymbols = (PSUPLDRSYM)RTMemAlloc(cbSymbols);
--            if (pImage->paSymbols)
--                memcpy(pImage->paSymbols, &pReq->u.In.abImage[pReq->u.In.offSymbols], cbSymbols);
--            else
-+            pImage->paSymbols = (PSUPLDRSYM)RTMemDup(&pReq->u.In.abImage[pReq->u.In.offSymbols], cbSymbols);
-+            if (!pImage->paSymbols)
-                 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for symbol table: %#x", cbSymbols);
-             SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
-         }
-     }
- 
-     /*
--     * Copy the bits / complete native loading.
-+     * Copy the bits and apply permissions / complete native loading.
-      */
-     if (RT_SUCCESS(rc))
-     {
-@@ -5395,7 +5487,26 @@ static int supdrvIOCtl_LdrLoad(PSUPDRVDE
-             rc = supdrvOSLdrLoad(pDevExt, pImage, pReq->u.In.abImage, pReq);
-         else
-         {
-+#ifdef SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+            uint32_t i;
-             memcpy(pImage->pvImage, &pReq->u.In.abImage[0], pImage->cbImageBits);
-+
-+            for (i = 0; i < pImage->cSegments; i++)
-+            {
-+                rc = RTR0MemObjProtect(pImage->hMemObjImage, pImage->paSegments[i].off, pImage->paSegments[i].cb,
-+                                       pImage->paSegments[i].fProt);
-+                if (RT_SUCCESS(rc))
-+                    continue;
-+                if (rc == VERR_NOT_SUPPORTED)
-+                    rc = VINF_SUCCESS;
-+                else
-+                    rc = supdrvLdrLoadError(rc, pReq, "RTR0MemObjProtect failed on seg#%u %#RX32 LB %#RX32 fProt=%#x",
-+                                            i, pImage->paSegments[i].off, pImage->paSegments[i].cb, pImage->paSegments[i].fProt);
-+                break;
-+            }
-+#else
-+            memcpy(pImage->pvImage, &pReq->u.In.abImage[0], pImage->cbImageBits);
-+#endif
-             Log(("vboxdrv: Loaded '%s' at %p\n", pImage->szName, pImage->pvImage));
-         }
-         SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
-@@ -5990,12 +6101,20 @@ static void supdrvLdrFree(PSUPDRVDEVEXT
-     pImage->pDevExt = NULL;
-     pImage->pNext   = NULL;
-     pImage->uState  = SUP_IOCTL_LDR_FREE;
-+#ifdef SUPDRV_USE_MEMOBJ_FOR_LDR_IMAGE
-+    RTR0MemObjFree(pImage->hMemObjImage, true /*fMappings*/);
-+    pImage->hMemObjImage = NIL_RTR0MEMOBJ;
-+#else
-     RTMemExecFree(pImage->pvImageAlloc, pImage->cbImageBits + 31);
-     pImage->pvImageAlloc = NULL;
-+#endif
-+    pImage->pvImage = NULL;
-     RTMemFree(pImage->pachStrTab);
-     pImage->pachStrTab = NULL;
-     RTMemFree(pImage->paSymbols);
-     pImage->paSymbols = NULL;
-+    RTMemFree(pImage->paSegments);
-+    pImage->paSegments = NULL;
-     RTMemFree(pImage);
- }
- 
---- a/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h
-+++ b/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h
-@@ -176,6 +176,11 @@
- # include <asm/set_memory.h>
- #endif
- 
-+/* for __flush_tlb_all() */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28) && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
-+# include <asm/tlbflush.h>
-+#endif
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
- # include <asm/smap.h>
- #else
diff --git a/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.12.bb b/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.14.bb
similarity index 93%
rename from meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.12.bb
rename to meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.14.bb
index 6c036d4..35dc495 100644
--- a/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.12.bb
+++ b/meta-openembedded/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.14.bb
@@ -12,11 +12,10 @@
 VBOX_NAME = "VirtualBox-${PV}"
 
 SRC_URI = "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 \
-    file://021-linux-5-8.patch \
     file://Makefile.utils \
 "
-SRC_URI[md5sum] = "3c351f7fd6376e0bb3c8489505a9450c"
-SRC_URI[sha256sum] = "05eff0321daa72f6d00fb121a6b4211f39964778823806fa0b7b751667dec362"
+SRC_URI[md5sum] = "6e4313df24fd00b0dc0437c3746b940d"
+SRC_URI[sha256sum] = "91fa05bcfce36316ca93e3927c9550ea66286fff4c5bec900b753fca278ce1a0"
 
 S ?= "${WORKDIR}/vbox_module"
 S_task-patch = "${WORKDIR}/${VBOX_NAME}"
diff --git a/meta-openembedded/meta-oe/recipes-test/cmocka/cmocka_1.1.5.bb b/meta-openembedded/meta-oe/recipes-test/cmocka/cmocka_1.1.5.bb
new file mode 100644
index 0000000..5aee5ef
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-test/cmocka/cmocka_1.1.5.bb
@@ -0,0 +1,39 @@
+DESCRIPTION = "cmocka is an elegant unit testing framework for C with support for mock \
+objects. It only requires the standard C library, works on a range of computing \
+platforms (including embedded) and with different compilers."
+HOMEPAGE = "https://cmocka.org/"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRCREV = "56eb3a183fc222120f86d0c54fd033992c30135e"
+SRC_URI = "git://git.cryptomilk.org/projects/cmocka.git \
+           file://run-ptest \
+           file://cmocka-uintptr_t.patch \
+          "
+
+S = "${WORKDIR}/git"
+
+inherit cmake ptest
+
+EXTRA_OECMAKE = "${@bb.utils.contains('PTEST_ENABLED', '1', '-DCMAKE_BUILD_TYPE=Debug -DUNIT_TESTING=ON', '', d)}"
+
+do_install_append () {
+    install -d ${D}${datadir}/${BPN}/example
+    install -d ${D}${datadir}/${BPN}/example/mock/chef_wrap
+    install -d ${D}${datadir}/${BPN}/example/mock/uptime
+
+    install -m 0755 ${B}/example/*_test ${D}/${datadir}/${BPN}/example
+    install -m 0755 ${B}/example/mock/chef_wrap/waiter_test_wrap ${D}/${datadir}/${BPN}/example/mock/chef_wrap
+    install -m 0755 ${B}/example/mock/uptime/uptime ${D}/${datadir}/${BPN}/example/mock/uptime
+    install -m 0755 ${B}/example/mock/uptime/test_uptime ${D}/${datadir}/${BPN}/example/mock/uptime
+}
+
+do_install_ptest () {
+    install -d ${D}${PTEST_PATH}/tests
+    install -m 0755 ${B}/tests/test_* ${D}${PTEST_PATH}/tests
+}
+
+PACKAGE_BEFORE_PN += "${PN}-examples"
+
+FILES_${PN}-examples = "${datadir}/${BPN}/example"
diff --git a/meta-openembedded/meta-oe/recipes-test/cmocka/files/cmocka-uintptr_t.patch b/meta-openembedded/meta-oe/recipes-test/cmocka/files/cmocka-uintptr_t.patch
new file mode 100644
index 0000000..8d3b73b
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-test/cmocka/files/cmocka-uintptr_t.patch
@@ -0,0 +1,53 @@
+From 5bd7b5d04435bd593349825973ce32290f5f604d Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Wed, 25 Jul 2018 09:55:25 +0800
+Subject: [PATCH] samba: cmocka.h: fix musl libc conflicting types error
+
+Fix build on qemumips64(el)
+
+taken from:
+[PATCH] libldb: fix musl libc conflicting types error
+
+/third_party/cmocka/cmocka.h:126:28: error: conflicting types for 'uintptr_t'
+            typedef unsigned int uintptr_t;
+                                 ^~~~~~~~~
+use __DEFINED_uintptr_t in alltypes.h to check if uintptr already defined
+
+Upstream-Status: Pending
+
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
+Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
+
+Taken from [PATCH] samba: cmocka.h: fix musl libc conflicting types error
+https://git.openembedded.org/meta-openembedded/commit/meta-networking/recipes-connectivity/samba?id=b758150d30a5fbdc47c465d0e9dca3a7e6d71f3c
+
+Signed-off-by: Armin Kuster <akuster808@gmail.com>
+
+This fix is not in cmocka, so pending pending??
+
+
+Index: git/include/cmocka.h
+===================================================================
+--- git.orig/include/cmocka.h
++++ git/include/cmocka.h
+@@ -116,7 +116,7 @@ typedef uintmax_t LargestIntegralType;
+     ((LargestIntegralType)(value))
+ 
+ /* Smallest integral type capable of holding a pointer. */
+-#if !defined(_UINTPTR_T) && !defined(_UINTPTR_T_DEFINED)
++#if !defined(__DEFINED_uintptr_t)
+ # if defined(_WIN32)
+     /* WIN32 is an ILP32 platform */
+     typedef unsigned int uintptr_t;
+@@ -140,9 +140,8 @@ typedef uintmax_t LargestIntegralType;
+ #  endif /* __WORDSIZE */
+ # endif /* _WIN32 */
+ 
+-# define _UINTPTR_T
+-# define _UINTPTR_T_DEFINED
+-#endif /* !defined(_UINTPTR_T) || !defined(_UINTPTR_T_DEFINED) */
++# define __DEFINED_uintptr_t
++#endif /* !defined(__DEFINED_uintptr_t) */
+ 
+ /* Perform an unsigned cast to uintptr_t. */
+ #define cast_to_pointer_integral_type(value) \
diff --git a/meta-openembedded/meta-oe/recipes-test/cmocka/files/run-ptest b/meta-openembedded/meta-oe/recipes-test/cmocka/files/run-ptest
new file mode 100644
index 0000000..48b9cd9
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-test/cmocka/files/run-ptest
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+cd tests
+for i in `ls *`; do
+   if [ ./$i ] ; then
+       echo "PASS: $i"
+   else
+       echo "FAIL: $i"
+   fi
+done
diff --git a/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_3.2.0.bb b/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_3.2.0.bb
deleted file mode 100644
index bdc110f..0000000
--- a/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_3.2.0.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "HTTP/2 State-Machine based protocol implementation"
-HOMEPAGE = "https://github.com/python-hyper/hyper-h2"
-LICENSE = "MIT"
-
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b6b2f6bbe76528af543242d606c14851"
-
-SRC_URI[md5sum] = "197a99c09f344a0dd987fab9801dc8d0"
-SRC_URI[sha256sum] = "875f41ebd6f2c44781259005b157faed1a5031df3ae5aa7bcb4628a6c0782f14"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += "${PYTHON_PN}-hpack ${PYTHON_PN}-hyperframe"
diff --git a/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_4.0.0.bb b/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_4.0.0.bb
new file mode 100644
index 0000000..ff1d20a
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-connectivity/python-h2/python3-h2_4.0.0.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "HTTP/2 State-Machine based protocol implementation"
+HOMEPAGE = "https://github.com/python-hyper/hyper-h2"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aa3b9b4395563dd427be5f022ec321c1"
+
+SRC_URI[md5sum] = "d086f6a9746a5f4eeb63bb3d0a482e1f"
+SRC_URI[sha256sum] = "bb7ac7099dd67a857ed52c815a6192b6b1f5ba6b516237fc24a085341340593d"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "${PYTHON_PN}-hpack ${PYTHON_PN}-hyperframe"
diff --git a/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb b/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
index 61623ac..0f032e6 100644
--- a/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
+++ b/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
@@ -42,6 +42,7 @@
     python3-alembic \
     python3-ansi2html \
     python3-ansicolors \
+    python3-argcomplete \
     python3-argexec \
     python3-appdirs \
     python3-apply-defaults \
@@ -227,7 +228,6 @@
     python3-mccabe \
     python3-kconfiglib \
     python3-grpcio-tools \
-    python3-jinja2 \
     python3-jsmin \
     python3-greenlet \
     python3-idna \
@@ -261,6 +261,7 @@
     python3-pyiface \
     python3-pyjwt \
     python3-pykwalify \
+    python3-docopt \
     python3-pylint \
     python3-pynetlinux \
     python3-pickleshare \
@@ -301,6 +302,7 @@
     python3-sdnotify \
     python3-pycodestyle \
     python3-pytest \
+    python3-iniconfig \
     python3-speaklater \
     python3-wtforms \
     python3-speedtest-cli \
@@ -454,6 +456,8 @@
 
 RDEPENDS_packagegroup-meta-python3-ptest = "\
     python3-cryptography-ptest \
-    "
+    python3-jinja2-ptest \
+    python3-markupsafe-ptest \
+"
 
 EXCLUDE_FROM_WORLD = "1"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-flask-uploads.inc b/meta-openembedded/meta-python/recipes-devtools/python/python-flask-uploads.inc
deleted file mode 100644
index cd7ac1a..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python-flask-uploads.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Flexible and efficient upload handling for Flask"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b712ac634b39469660c9bdfb8d03421c"
-
-SRC_URI[md5sum] = "e5eee34aa92b64a4d22847672b3858a1"
-SRC_URI[sha256sum] = "53ecbd6033667d50ae02b63adebbaa33c7fc56c09e5293025810cf9d841ecb02"
-
-PYPI_PACKAGE = "Flask-Uploads"
-
-RDEPENDS_${PN} += "\
-    ${PYTHON_PN}-flask \
-    "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto.inc b/meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto.inc
deleted file mode 100644
index 232cdb7..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-DESCRIPTION = "Cryptographic modules for Python."
-HOMEPAGE = "http://www.pycrypto.org/"
-LICENSE = "PSFv2"
-LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-pycrypto:"
-
-DEPENDS += " gmp"
-
-inherit pypi autotools-brokensep
-
-SRC_URI += "file://cross-compiling.patch \
-            file://CVE-2013-7459.patch \
-           "
-
-SRC_URI[md5sum] = "55a61a054aa66812daf5161a0d5d7eda"
-SRC_URI[sha256sum] = "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c"
-
-do_compile[noexec] = "1"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch b/meta-openembedded/meta-python/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
deleted file mode 100644
index ce8ca0b..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 2de281fdca88f223ace1eb6428a77b9903c69264 Mon Sep 17 00:00:00 2001
-From: Nicola Lunghi <nicola.lunghi@jci.com>
-Date: Thu, 14 Nov 2019 11:58:28 +0000
-Subject: [PATCH] setup.py: move pytest-runner to test_requirements
-
-This fixes an issue with yocto build.
-pytest-runner is only needed when running tests.
-
-Upstream-Status: Pending
----
- setup.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index 9a50767..e3b1c6e 100644
---- a/setup.py
-+++ b/setup.py
-@@ -12,9 +12,9 @@ requirements = [
-     'six',
- ]
- 
--setup_requirements = ['pytest-runner', ]
-+setup_requirements = []
- 
--test_requirements = ['pytest>=3', ]
-+test_requirements = ['pytest>=3', 'pytest-runner']
- 
- setup(
-     author="Nicolas Aimetti",
--- 
-2.20.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_1.12.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_1.12.1.bb
new file mode 100644
index 0000000..c14a7eb
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_1.12.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Argcomplete provides easy, extensible command line tab completion of arguments for your Python script."
+HOMEPAGE = "https://github.com/kislyuk/argcomplete"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93"
+
+SRC_URI[md5sum] = "2262d0466a40d42267b424bba5010a0b"
+SRC_URI[sha256sum] = "849c2444c35bb2175aea74100ca5f644c29bf716429399c0f2203bb5d9a8e4e6"
+
+PYPI_PACKAGE = "argcomplete"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-core \
+"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.3.bb
similarity index 71%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.3.bb
index 910de12..5e03ad5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.3.bb
@@ -3,8 +3,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://COPYING.txt;md5=f2d38d8a40bf73fd4b3d16ca2e5882d1"
 
-SRC_URI[md5sum] = "57502b5b34ccfd97b180260071f5799a"
-SRC_URI[sha256sum] = "73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7"
+SRC_URI[md5sum] = "57fd468ae3eb055f6871106e8f7813e2"
+SRC_URI[sha256sum] = "84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.2.0.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.1.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.2.0.bb
index c65be72..cc067c4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.1.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.2.0.bb
@@ -4,8 +4,8 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
 
-SRC_URI[sha256sum] = "91759bd0ee5ef0d4fa24144dfa551670730baeca8cf2fff1cc59f734ecd21de6"
-SRC_URI[md5sum] = "693c1bd6635bee8a591a70ea924ad676"
+SRC_URI[sha256sum] = "a33aa2e5534fd74401ac95686886e655e3b2ce6383b3f958199b6e70a87c94bf"
+SRC_URI[md5sum] = "0940aa8bfd1a07f06a983bb6dc78f1ca"
 
 inherit pypi setuptools3 ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.9.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.11.bb
similarity index 75%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.9.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.11.bb
index e677a69..3b2aa5b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.9.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.3.11.bb
@@ -5,8 +5,8 @@
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
 
-SRC_URI[md5sum] = "f5fbd528e7b5977ad71466947af61f99"
-SRC_URI[sha256sum] = "7f8035faafda15d26098bf2ffe16aaba1c78511ce13e0815d2efe58ba392b501"
+SRC_URI[md5sum] = "7e3dbe0aefa331e80f515d3c41cc3b8c"
+SRC_URI[sha256sum] = "826a288ee6d9c4ec1184e64e9566c09d3b73be8f4283c1898fa4332f1daf8dbf"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.2.1.bb
deleted file mode 100644
index a4aaa3c..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.2.1.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "A colored formatter for the python logging module"
-HOMEPAGE = "https://github.com/borntyping/python-colorlog"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://README.md;md5=05592f7a5b83bfc756f62dbd70a9b9b5"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE = "colorlog"
-
-SRC_URI[md5sum] = "a01336efc6f54e58e3ed4f331d76c2f0"
-SRC_URI[sha256sum] = "75e55822c3a3387d721579241e776de2cf089c9ef9528b1f09e8b04d403ad118"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.4.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.4.0.bb
new file mode 100644
index 0000000..4a40ef3
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_4.4.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "A colored formatter for the python logging module"
+HOMEPAGE = "https://github.com/borntyping/python-colorlog"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=85a1d478cd35d62763a1419e948bdde4"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "colorlog"
+
+SRC_URI[md5sum] = "0997566a87c6fdec0baa88055adc06c3"
+SRC_URI[sha256sum] = "0272c537469ab1e63b9915535874d15b671963c9325db0c4891a2aeff97ce3d1"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.1.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.1.bb
index 6b2af12..b78de58 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-configparser_5.0.1.bb
@@ -5,8 +5,8 @@
 
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=10;endline=10;md5=23f9ad5cad3d8cc0336e2a5d8a87e1fa"
 
-SRC_URI[md5sum] = "558114054aa5610365df1b34d3fea349"
-SRC_URI[sha256sum] = "2ca44140ee259b5e3d8aaf47c79c36a7ab0d5e94d70bd4105c03ede7a20ea5a1"
+SRC_URI[md5sum] = "5faf185693cd21d83f6a3bc01b5733fa"
+SRC_URI[sha256sum] = "005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a"
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native ${PYTHON_PN}-toml-native"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.1.bb
similarity index 73%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.1.bb
index 59347c9..9486fe2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.1.1.bb
@@ -4,8 +4,8 @@
 LICENSE = "Apache-2.0 | BSD"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4"
 
-SRC_URI[md5sum] = "1ba5b0743e2876e909f7cfc28b744f27"
-SRC_URI[sha256sum] = "2660bc3a720d3955341803195ae5352a236c5f26e01a178c44fc5ee1f0ef1182"
+SRC_URI[md5sum] = "fbc43f8b155b52f9ed163d3555ea5e83"
+SRC_URI[sha256sum] = "5529c516194122fec7db1682812e2314ddff4221fdf993169118f9c0d291e2f6"
 
 PYPI_PACKAGE = "cryptography_vectors"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.1.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.1.bb
index 9ac23cd..1d6a9b3 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography_3.1.1.bb
@@ -6,8 +6,8 @@
 
 LDSHARED += "-pthread"
 
-SRC_URI[md5sum] = "aa91e4974981b29e99b863c54034c361"
-SRC_URI[sha256sum] = "26409a473cc6278e4c90f782cd5968ebad04d3911ed1c402fc86908c17633e08"
+SRC_URI[md5sum] = "c3807891d36aa9de8187e9db8b2bb457"
+SRC_URI[sha256sum] = "9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d"
 
 SRC_URI += " \
     file://run-ptest \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb
index fb7db16..5326924 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb
@@ -22,4 +22,4 @@
     ${PYTHON_PN}-stringold \
 "
 
-BBCLASSEXTEND = "native"
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.11.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.12.1.bb
similarity index 71%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.11.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.12.1.bb
index 81f55ff..60bdbaa 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.11.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-djangorestframework_3.12.1.bb
@@ -5,8 +5,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.md;md5=7879a5a716147a784f7e524c9cf103c1"
 
-SRC_URI[md5sum] = "c8ea3e4c3c0d705acf70184faeb2b696"
-SRC_URI[sha256sum] = "6dd02d5a4bd2516fb93f80360673bf540c3b6641fec8766b1da2870a5aa00b32"
+SRC_URI[md5sum] = "47d5ea46923a131c5fbefeb610c6ce2c"
+SRC_URI[sha256sum] = "d54452aedebb4b650254ca092f9f4f5df947cb1de6ab245d817b08b4f4156249"
 PYPI_PACKAGE = "djangorestframework"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb
new file mode 100644
index 0000000..a243206
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Pythonic argument parser, that will make you smile"
+HOMEPAGE = "http://docopt.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE-MIT;md5=09b77fb74986791a3d4a0e746a37d88f"
+
+inherit setuptools3 pypi
+
+SRC_URI[md5sum] = "4bc74561b37fad5d3e7d037f82a4c3b1"
+SRC_URI[sha256sum] = "49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb
index 758c2ac..e8d5b5f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb
@@ -1,2 +1,14 @@
+DESCRIPTION = "Flexible and efficient upload handling for Flask"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b712ac634b39469660c9bdfb8d03421c"
+
+SRC_URI[md5sum] = "e5eee34aa92b64a4d22847672b3858a1"
+SRC_URI[sha256sum] = "53ecbd6033667d50ae02b63adebbaa33c7fc56c09e5293025810cf9d841ecb02"
+
+PYPI_PACKAGE = "Flask-Uploads"
+
 inherit pypi setuptools3
-require python-flask-uploads.inc
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-flask \
+    "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.6.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.9.0.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.6.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.9.0.bb
index dbeb3a6..06c45f2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.6.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-gevent_20.9.0.bb
@@ -20,8 +20,8 @@
     file://libev-conf.patch;patch=1;pnum=1 \
 "
 
-SRC_URI[md5sum] = "27b07fe9fdfff2d75e3d140e890489b1"
-SRC_URI[sha256sum] = "a23c2abf08e851c988723f6a2996d495f513a2c0dc70f9956af03af8debdb5d1"
+SRC_URI[md5sum] = "9366ee7eebed48003f8a748568ef1f70"
+SRC_URI[sha256sum] = "5f6d48051d336561ec08995431ee4d265ac723a64bba99cc58c3eb1a4d4f5c8d"
 
 # The python-gevent has no autoreconf ability
 # and the logic for detecting a cross compile is flawed
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.3.bb
similarity index 69%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.3.bb
index d79ac3c..cf65044 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_1.12.3.bb
@@ -3,7 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=94023d14f6b58272fd885e4e3f2f08b3"
 
-SRC_URI[md5sum] = "92106822131f76ca77b77009674e78e4"
-SRC_URI[sha256sum] = "ddadc243ce627512c2a27e11d369f5ddf658ef80dbffb247787499486ef1ea98"
+SRC_URI[md5sum] = "24e87dbe11fbbe3d97f23c230f518531"
+SRC_URI[sha256sum] = "844ef76bda585ea0ea2d5e7f8f9a0eb10d6e2eba66c4fea0210ec7843941cb1a"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.16.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.17.bb
similarity index 65%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.16.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.17.bb
index 4556d49..744265e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.16.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_0.4.17.bb
@@ -3,7 +3,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=03143d7a1a9f5d8a0fee825f24ca9c36 \
                     file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a"
 
-SRC_URI[md5sum] = "9aebea08f7beb6b87143d0588578c984"
-SRC_URI[sha256sum] = "6e06eac722676797e8fce4adb8ad3dc57a1bb3adfb0dd3fdf8306c055a38456c"
+SRC_URI[md5sum] = "d964c95c2d2f0f02f36c75e158d8e3dc"
+SRC_URI[sha256sum] = "41d8835c69a78de718e466dd0e6bfd4b46125f21a67c3ff6d76d8d8059868d6b"
 
 inherit pypi distutils3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_2.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.0.1.bb
similarity index 71%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_2.6.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.0.1.bb
index de1e985..92831bf 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_2.6.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.0.1.bb
@@ -4,8 +4,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d"
 
-SRC_URI[md5sum] = "de3a507d9274912a3a177849a9349edb"
-SRC_URI[sha256sum] = "8ee358ea6c23de896b9d1925ebe6a8504bb2ba7e98d5ccf4d07ab7f3b28f3819"
+SRC_URI[md5sum] = "53faa88dedddba1227f9c41d65440c54"
+SRC_URI[sha256sum] = "8ff8f292c9bf52bbefdc620410e7defd1c95e7eeb1a5cfc2859aaea4b1877ff5"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_1.7.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_2.0.0.bb
similarity index 64%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_1.7.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_2.0.0.bb
index de0fc78..325a41c 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_1.7.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-importlib-metadata_2.0.0.bb
@@ -5,10 +5,10 @@
 
 inherit pypi setuptools3
 
-SRC_URI = "https://files.pythonhosted.org/packages/e2/ae/0b037584024c1557e537d25482c306cf6327b5a09b6c4b893579292c1c38/importlib_metadata-1.7.0.tar.gz"
+SRC_URI = "https://files.pythonhosted.org/packages/56/1f/74c3e29389d34feea2d62ba3de1169efea2566eb22e9546d379756860525/importlib_metadata-2.0.0.tar.gz"
 S = "${WORKDIR}/importlib_metadata-${PV}"
-SRC_URI[md5sum] = "4505ea85600cca1e693a4f8f5dd27ba8"
-SRC_URI[sha256sum] = "90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"
+SRC_URI[md5sum] = "3dd91821c930a3c3633e99a7025aa9c2"
+SRC_URI[sha256sum] = "77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
 RDEPENDS_${PN} += "${PYTHON_PN}-zipp ${PYTHON_PN}-pathlib2"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-iniconfig_1.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-iniconfig_1.0.1.bb
new file mode 100644
index 0000000..9ed0e03
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-iniconfig_1.0.1.bb
@@ -0,0 +1,8 @@
+SUMMARY = "A small and simple INI-file parser module"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a6bb0320b04a0a503f12f69fea479de9"
+
+SRC_URI[sha256sum] = "e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"
+
+inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.4.bb
similarity index 73%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.4.bb
index 0d04157..0c58427 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.5.4.bb
@@ -4,8 +4,8 @@
 SECTION = "devel/python"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489"
 
-SRC_URI[md5sum] = "844c49ad1bf16a957b490c27b3b9844f"
-SRC_URI[sha256sum] = "171c5f365791073426b5ed3a156c2081a47f88c329161fd28228ff2da4c97ddb"
+SRC_URI[md5sum] = "6b90dd55851a8ccb3a19fe2cb82cb82f"
+SRC_URI[sha256sum] = "ba040c24d20aa302f78f4747df549573ae1eaf8e1084269199154da9c483f07f"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2/run-ptest
deleted file mode 100644
index 5cec711..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2/run-ptest
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-pytest
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend b/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend
new file mode 100644
index 0000000..91814e6
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend
@@ -0,0 +1,2 @@
+# Main recipe was moved to oe-core, but with ptest disabled
+inherit ${@bb.utils.filter('DISTRO_FEATURES', 'ptest', d)}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.11.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.11.2.bb
deleted file mode 100644
index 681acf8..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-jinja2_2.11.2.bb
+++ /dev/null
@@ -1,43 +0,0 @@
-DESCRIPTION = "Python Jinja2: A small but fast and easy to use stand-alone template engine written in pure python."
-
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462"
-
-SRC_URI[sha256sum] = "89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"
-
-PYPI_PACKAGE = "Jinja2"
-
-CLEANBROKEN = "1"
-
-inherit pypi setuptools3 ptest
-
-SRC_URI += " \
-	file://run-ptest \
-"
-
-do_install_ptest() {
-    install -d ${D}${PTEST_PATH}/tests
-    cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
-}
-
-RDEPENDS_${PN}-ptest += " \
-	${PYTHON_PN}-pytest \
-	${PYTHON_PN}-unixadmin \
-"
-
-RDEPENDS_${PN} += " \
-    ${PYTHON_PN}-asyncio \
-    ${PYTHON_PN}-crypt \
-    ${PYTHON_PN}-io \
-    ${PYTHON_PN}-json \
-    ${PYTHON_PN}-markupsafe \
-    ${PYTHON_PN}-math \
-    ${PYTHON_PN}-netclient \
-    ${PYTHON_PN}-numbers\
-    ${PYTHON_PN}-pickle \
-    ${PYTHON_PN}-pprint \
-    ${PYTHON_PN}-shell \
-    ${PYTHON_PN}-threading \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.52.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.53.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.52.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.53.bb
index e6ccd7b..27b690f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.52.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-langtable_0.0.53.bb
@@ -6,8 +6,8 @@
 
 LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
 
-SRC_URI[md5sum] = "240a62b84ed29f6530ceae60609f7eff"
-SRC_URI[sha256sum] = "a2c499704c91c0a23e5db92e80ad1d45e51466b82ffaee478e5bb781460b3db5"
+SRC_URI[md5sum] = "d8f99adfb184f9def22539310f97ce80"
+SRC_URI[sha256sum] = "fb17fd4d8e491c79159f81aa06ebacb18673fce59dac96f4e9d2d2db27a2e374"
 
 inherit pypi setuptools3 python3native
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.16.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.17.1.bb
similarity index 75%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.16.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.17.1.bb
index 3428dbe..9246d1b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.16.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-core_1.17.1.bb
@@ -6,8 +6,8 @@
 
 inherit pypi setuptools3
 
-SRC_URI[md5sum] = "de7bda49c4146ba242923a88c587cd7a"
-SRC_URI[sha256sum] = "2181a60906fea3104dcfa3923f9654928502cd7541ff9b4d76c6ae29c6a9d9fc"
+SRC_URI[md5sum] = "dea76a83c7130f59b7e807c3b2f1b3b5"
+SRC_URI[sha256sum] = "b4a9f934f4dbf9b1d5c74259f871b4187aaa754b139964153f7702badaaccffd"
 
 CLEANBROKEN = "1"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.6.0.bb
similarity index 76%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.5.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.6.0.bb
index 39bc37f..ae14aff 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.5.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-luma-oled_3.6.0.bb
@@ -8,8 +8,8 @@
 
 inherit pypi setuptools3
 
-SRC_URI[md5sum] = "64436aaa7a05a205430b38d2f9a9bec7"
-SRC_URI[sha256sum] = "ca62fd7337ee9780b32a8cdc10bcd69879f2cfd97720ab2e17e254a160f6c24f"
+SRC_URI[md5sum] = "ff45a3067658434339da2586a97e526b"
+SRC_URI[sha256sum] = "dbd8ebce1c0b10feabb725b321d4a7f9f7353fe16878c8145ca332a173c193c9"
 
 CLEANBROKEN = "1"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.2.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.2.2.bb
deleted file mode 100644
index ce5dde6..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.2.2.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "A Python implementation of John Gruber's Markdown."
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.md;md5=745aaad0c69c60039e638bff9ffc59ed"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE = "Markdown"
-PYPI_SRC_URI = "https://files.pythonhosted.org/packages/44/30/cb4555416609a8f75525e34cbacfc721aa5b0044809968b2cf553fd879c7/Markdown-${PV}.tar.gz"
-SRC_URI[md5sum] = "6e8daf1e566bf3572c137ada399fe40b"
-SRC_URI[sha256sum] = "1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"
-
-BBCLASSEXTEND = "native"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-logging ${PYTHON_PN}-setuptools"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.3.bb
new file mode 100644
index 0000000..db8311b
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-markdown_3.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A Python implementation of John Gruber's Markdown."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=745aaad0c69c60039e638bff9ffc59ed"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "Markdown"
+SRC_URI[md5sum] = "76eb34a058bb8b637ccadc4ce384bae4"
+SRC_URI[sha256sum] = "4f4172a4e989b97f96860fa434b89895069c576e2b537c4b4eed265266a7affc"
+
+BBCLASSEXTEND = "native"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-logging ${PYTHON_PN}-setuptools"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe/run-ptest
deleted file mode 100644
index 5cec711..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe/run-ptest
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-pytest
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend b/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend
new file mode 100644
index 0000000..91814e6
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend
@@ -0,0 +1,2 @@
+# Main recipe was moved to oe-core, but with ptest disabled
+inherit ${@bb.utils.filter('DISTRO_FEATURES', 'ptest', d)}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb
deleted file mode 100644
index 7de57cb..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb
+++ /dev/null
@@ -1,27 +0,0 @@
-DESCRIPTION = "Implements a XML/HTML/XHTML Markup safe string for Python"
-HOMEPAGE = "http://github.com/mitsuhiko/markupsafe"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
-
-SRC_URI[md5sum] = "43fd756864fe42063068e092e220c57b"
-SRC_URI[sha256sum] = "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"
-
-PYPI_PACKAGE = "MarkupSafe"
-inherit pypi ptest setuptools3
-
-RDEPENDS_${PN} += "${PYTHON_PN}-stringold"
-
-BBCLASSEXTEND = "native nativesdk"
-
-SRC_URI += " \
-	file://run-ptest \
-"
-
-RDEPENDS_${PN}-ptest += " \
-	${PYTHON_PN}-pytest \
-"
-
-do_install_ptest() {
-	install -d ${D}${PTEST_PATH}/tests
-	cp -f ${S}/tests/* ${D}${PTEST_PATH}/tests/
-}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_4.7.6.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_5.0.0.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_4.7.6.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_5.0.0.bb
index 02c541b..676fbae 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_4.7.6.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-multidict_5.0.0.bb
@@ -4,8 +4,8 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e74c98abe0de8f798ca609137f9cef4a"
 
-SRC_URI[md5sum] = "40b6ca77171ac8af55f7aa60049f3cdf"
-SRC_URI[sha256sum] = "fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"
+SRC_URI[md5sum] = "c2c3311e25636a6f213e998cd1e80d72"
+SRC_URI[sha256sum] = "1b324444299c3a49b601b1bf621fc21704e29066f6ac2b7d7e4034a4a18662a1"
 
 inherit pypi setuptools3 ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.1.bb
similarity index 62%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.1.bb
index dae1ebf..af5da52 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-nocasedict_1.0.1.bb
@@ -3,7 +3,7 @@
 LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=1803fa9c2c3ce8cb06b4861d75310742"
 
-SRC_URI[md5sum] = "14b405bf7ffe9d0f784aa9c3c39e277b"
-SRC_URI[sha256sum] = "22840b434e40f20da6d2ccf0821baba54589e2476499b65420b6e4c2e669aa04"
+SRC_URI[md5sum] = "93e7f19f73c7cd56c36cd7535b6b9ab1"
+SRC_URI[sha256sum] = "6e5d5bd11de33f93d22545d9ed23a0b98f840f2cdac0d749d2faa4617adc7772"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.3.bb
similarity index 61%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.3.bb
index 8509cd0..1119c7f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-nocaselist_1.0.3.bb
@@ -3,7 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
 
-SRC_URI[md5sum] = "10e58542c1225aff3f057e89e9ae4394"
-SRC_URI[sha256sum] = "3cfe964c436991cd6bd9f2cf23375c484ec7cf0c7488471381eff13a4fdac902"
+SRC_URI[md5sum] = "42ba878fd70611cf345c61edd83f5fb0"
+SRC_URI[sha256sum] = "7e6decb7d85563b9044913c9087ef4b691bc3da4d7ad1d88968cdea409553326"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.1.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.1.bb
index 8bf80e6..d93bc88 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.1.bb
@@ -8,8 +8,8 @@
 
 inherit pypi setuptools3
 
-SRC_URI[md5sum] = "45e80d9b8066a8d0ba1ecfffe271bd3d"
-SRC_URI[sha256sum] = "e3d286198baaea195c8b3bc221941d25a3ab0e1507fc1779bdb7473806394be4"
+SRC_URI[md5sum] = "32f93c0ed92c7439f7a715ed258fd35d"
+SRC_URI[sha256sum] = "9feb068e822be7b3a116324e01fb6028eb1d66412bf98595ae72698965cb1cae"
 
 DEPENDS += "${PYTHON_PN}-pytest-runner-native"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.3.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.3.bb
index 1eade98..da1ffd0 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.1.3.bb
@@ -6,8 +6,8 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=c2a8f987b2ce77c368c6b3e1b5b10774"
 
-SRC_URI[md5sum] = "b4ce7c64f549ed48b47877fc64281031"
-SRC_URI[sha256sum] = "b64ffd87a2cfd31b40acd4b92cb72ea9a52a48165aec4c140e78fd69c45d1444"
+SRC_URI[md5sum] = "f10372d83a1c55cae217e8c05bf9bc5d"
+SRC_URI[sha256sum] = "babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.1.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.1.bb
index 7775d73..d966595 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.16.1.bb
@@ -10,8 +10,8 @@
 
 inherit pypi ptest setuptools3
 
-SRC_URI[md5sum] = "ec78e4e42512b93f80b9093416ad7417"
-SRC_URI[sha256sum] = "e437420e65fa72a2805f4036f986669c48d54944eeb0e47c8ba16f98cbdcd599"
+SRC_URI[md5sum] = "d4a7bbdf505dee964eb1e5e6e7f80c34"
+SRC_URI[sha256sum] = "d43a2e9ae003164978b60fdf8cd920d8581e1a5991df8dded29b00f4850ec83a"
 
 DEPENDS += "python3-setuptools-scm-native"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_1.0.1.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_1.0.1.bb
index 18f3390..a065b6c 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-prettytable_1.0.1.bb
@@ -1,10 +1,10 @@
 SUMMARY = "Python library for displaying tabular data in a ASCII table format"
 HOMEPAGE = "http://code.google.com/p/prettytable"
 LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://COPYING;md5=3e73500ffa52de5071cff65990055282"
+LIC_FILES_CHKSUM = "file://COPYING;md5=c9a6829fcd174d9535b46211917c7671"
 
-SRC_URI[md5sum] = "a6b80afeef286ce66733d54a0296b13b"
-SRC_URI[sha256sum] = "2d5460dc9db74a32bcc8f9f67de68b2c4f4d2f01fa3bd518764c69156d9cacd9"
+SRC_URI[md5sum] = "b5bd0acec56ae7ccf5ac22d3f671c3a7"
+SRC_URI[sha256sum] = "6bb7f539903cb031fecb855b615cbcac8cd245ebc6fa51c6e23ab3386db89771"
 
 do_install_append() {
     perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"`
@@ -23,6 +23,8 @@
 	file://run-ptest \
 "
 
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
 RDEPENDS_${PN} += " \
 	${PYTHON_PN}-math \
 	${PYTHON_PN}-html \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pybind11_2.5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pybind11_2.5.0.bb
index 9674ec0..5d57590 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pybind11_2.5.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pybind11_2.5.0.bb
@@ -32,3 +32,5 @@
 	distutils3_do_install
 	cmake_do_install
 }
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.5.0.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.5.0.bb
index b444df0..adfdbb1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_7.5.0.bb
@@ -3,8 +3,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5"
 
-SRC_URI[md5sum] = "7ab862743ff33dafc93206c1435abc5e"
-SRC_URI[sha256sum] = "f594231efb34b86eeb463611662bca21a6962793885d3ad68195286940f7473d"
+SRC_URI[md5sum] = "d35c610f57cae909348ff6c60e5e9256"
+SRC_URI[sha256sum] = "2f346a88ddc27a19cc68bc2d3e8929d89276298cb1c11871b82a87fbdafb95a8"
 
 PYPI_PACKAGE = "PyChromecast"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto/CVE-2013-7459.patch
similarity index 100%
rename from meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto/CVE-2013-7459.patch
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto/cross-compiling.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto/cross-compiling.patch
similarity index 100%
rename from meta-openembedded/meta-python/recipes-devtools/python/python-pycrypto/cross-compiling.patch
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto/cross-compiling.patch
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb
index a20eafe..78a1ef2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb
@@ -1,7 +1,23 @@
-inherit distutils3
-require python-pycrypto.inc
+DESCRIPTION = "Cryptographic modules for Python."
+HOMEPAGE = "http://www.pycrypto.org/"
+LICENSE = "PSFv2"
+LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d"
 
-SRC_URI += "file://0001-Replace-time.clock-with-time.process_time.patch"
+DEPENDS += " gmp"
+
+export HOST_SYS
+
+inherit pypi autotools-brokensep distutils3
+
+SRC_URI += "file://cross-compiling.patch \
+            file://CVE-2013-7459.patch \
+            file://0001-Replace-time.clock-with-time.process_time.patch \
+           "
+
+SRC_URI[md5sum] = "55a61a054aa66812daf5161a0d5d7eda"
+SRC_URI[sha256sum] = "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c"
+
+do_compile[noexec] = "1"
 
 # We explicitly call distutils_do_install, since we want it to run, but
 # *don't* want the autotools install to run, since this package doesn't
@@ -9,3 +25,5 @@
 do_install() {
        distutils3_do_install
 }
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify/0001-rule.py-fix-missing-comma.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify/0001-rule.py-fix-missing-comma.patch
new file mode 100644
index 0000000..689355e
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify/0001-rule.py-fix-missing-comma.patch
@@ -0,0 +1,34 @@
+From f96b76efb810d7d559254d0ec58de628e09f525a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= <marti.f.bolivar@gmail.com>
+Date: Mon, 13 Jan 2020 08:42:05 -0800
+Subject: [PATCH] rule.py: fix missing comma
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+A line in the defined_keywords list is missing a comma. Add it.
+
+Signed-off-by: Martí Bolívar <marti.f.bolivar@gmail.com>
+
+Upstream-Status: Backport [https://github.com/Grokzen/pykwalify.git]
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ pykwalify/rule.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pykwalify/rule.py b/pykwalify/rule.py
+index 7ac2c9e..f044b69 100644
+--- a/pykwalify/rule.py
++++ b/pykwalify/rule.py
+@@ -340,7 +340,7 @@ class Rule(object):
+             ('matching', 'matching'),
+             ('matching_rule', 'matching_rule'),
+             ('name', 'name'),
+-            ('nullable', 'nullable')
++            ('nullable', 'nullable'),
+             ('parent', 'parent'),
+             ('pattern', 'pattern'),
+             ('pattern_regexp', 'pattern_regexp'),
+-- 
+2.18.2
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify_1.7.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify_1.7.0.bb
index 5d029bd..2df30ae 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify_1.7.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pykwalify_1.7.0.bb
@@ -7,13 +7,16 @@
 SRC_URI[md5sum] = "58357f1d0f77de976e73dbd3660af75b"
 SRC_URI[sha256sum] = "7e8b39c5a3a10bc176682b3bd9a7422c39ca247482df198b402e8015defcceb2"
 
+SRC_URI += "file://0001-rule.py-fix-missing-comma.patch"
+
 PYPI_PACKAGE = "pykwalify"
 inherit setuptools3 pypi
 unset _PYTHON_SYSCONFIGDATA_NAME
 
 RDEPENDS_${PN} = "\
+    ${PYTHON_PN}-docopt \
     ${PYTHON_PN}-dateutil \
     ${PYTHON_PN}-pyyaml \
 "
 
-BBCLASSEXTEND = "native"
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.1.bb
similarity index 72%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.1.bb
index 8f33152..211580b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyperclip_1.8.1.bb
@@ -3,8 +3,8 @@
 LICENSE = "BSD"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=d7dd4b0d1f7153322a546e89b5a0a632"
 
-SRC_URI[md5sum] = "c2564a74b909b6fc32401afd619de83d"
-SRC_URI[sha256sum] = "b75b975160428d84608c26edba2dec146e7799566aea42c1fe1b32e72b6028f2"
+SRC_URI[md5sum] = "0ac879899da5c2af755a834245ca6a0f"
+SRC_URI[sha256sum] = "9abef1e79ce635eb62309ecae02dfb5a3eb952fa7d6dce09c1aef063f81424d3"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.7.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.8.0.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.7.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.8.0.bb
index 66f026c..e09b633 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.7.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pystemd_0.8.0.bb
@@ -2,8 +2,8 @@
 LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c"
 
-SRC_URI[md5sum] = "f493c3e54457e49fe3c160274b863bac"
-SRC_URI[sha256sum] = "f5dc49d02995ab96335d9e94f9fe036673d89b8cc9907e7a0ac83c06665f2430"
+SRC_URI[md5sum] = "f993739eca645749f18d4ccfd4a0fbf3"
+SRC_URI[sha256sum] = "cac2e42043ab28d43adf33dab493c6a3cf8a99794f824ae8af6d9cd6458b9972"
 
 DEPENDS = "systemd"
 REQUIRED_DISTRO_FEATURES = "systemd"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch
index c29fb12..8c5c172 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch
@@ -14,23 +14,26 @@
 Signed-off-by: Derek Straka <derek@asterius.io>
 
 Signed-off-by: Yuan Chao <yuanc.fnst@cn.fujitsu.com>
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/setup.py b/setup.py
-index adbafb5..75fdd09 100644
---- a/setup.py
-+++ b/setup.py
-@@ -19,7 +19,7 @@ INSTALL_REQUIRES = [
- def main():
-     setup(
-         use_scm_version={"write_to": "src/_pytest/_version.py"},
--        setup_requires=["setuptools-scm", "setuptools>=40.0"],
-+        setup_requires=["setuptools>=40.0"],
-         package_dir={"": "src"},
-         extras_require={
-             "testing": [
+Rebase for pytest 6.1.0.
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ setup.cfg | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/setup.cfg b/setup.cfg
+index 60f6564..c4d1471 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -55,7 +55,6 @@ package_dir =
+ 	=src
+ setup_requires = 
+ 	setuptools>=40.0
+-	setuptools-scm
+ zip_safe = no
+ 
+ [options.entry_points]
 -- 
 2.17.1
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_5.4.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_6.1.0.bb
similarity index 89%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_5.4.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_6.1.0.bb
index ca67223..1da43c4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_5.4.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest_6.1.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=81eb9f71d006c6b268cf4388e3c98f7b"
 
-SRC_URI[sha256sum] = "7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"
+SRC_URI[sha256sum] = "d010e24666435b39a4cf48740b039885642b6c273a3f77be3e7e03554d2806b7"
 
 SRC_URI_append = " file://0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch "
 
@@ -13,6 +13,7 @@
     ${PYTHON_PN}-attrs \
     ${PYTHON_PN}-debugger \
     ${PYTHON_PN}-doctest \
+    ${PYTHON_PN}-iniconfig \
     ${PYTHON_PN}-json \
     ${PYTHON_PN}-pluggy \
     ${PYTHON_PN}-py \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.10.11.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.10.11.bb
new file mode 100644
index 0000000..df2c00b
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.10.11.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Alternative regular expression module, to replace re."
+HOMEPAGE = "https://bitbucket.org/mrabarnett/mrab-regex/src"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=f0a3e4a2554ebb89c046c93d45d8e4bc"
+
+inherit pypi setuptools3
+
+SRC_URI[md5sum] = "642c259122a3b578cec66d8bba5665e4"
+SRC_URI[sha256sum] = "463e770c48da76a8da82b8d4a48a541f314e0df91cbb6d873a341dbe578efafd"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.7.14.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.7.14.bb
deleted file mode 100644
index 5c608c9..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2020.7.14.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Alternative regular expression module, to replace re."
-HOMEPAGE = "https://bitbucket.org/mrabarnett/mrab-regex/src"
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=ee7987010dadc17745d623f406b500ec"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "c3a53929c3797289566368be4b6b964a"
-SRC_URI[sha256sum] = "3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.2.bb
similarity index 65%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.2.bb
index 1f5d91d..e226e11 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.2.bb
@@ -5,17 +5,13 @@
 
 FILESEXTRAPATHS_prepend := "${THISDIR}/python-rfc3339-validator:"
 
-SRC_URI[md5sum] = "9d8899041d83f98180bddd8b62ee7e99"
-SRC_URI[sha256sum] = "20a600d01fbb1f793cbb6f4ec4ebb2104f4c9e80d74d5f78350b63ecc6cccd08"
+SRC_URI[md5sum] = "2c233007189d5ef21046cb2afac51a96"
+SRC_URI[sha256sum] = "c9659c3183488a1875c4d327c9873d9e92c54cdcd69dfbfae7546ad8b27baf9a"
 
 PYPI_PACKAGE = "rfc3339_validator"
 
 inherit pypi setuptools3
 
-SRC_URI_append = " \
-    file://0001-setup.py-move-pytest-runner-to-test_requirements.patch \
-"
-
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-core \
     ${PYTHON_PN}-datetime \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.17.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.18.0.bb
similarity index 72%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.17.5.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.18.0.bb
index 5495fa0..e4ab9f3 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.17.5.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_0.18.0.bb
@@ -5,8 +5,8 @@
 LICENSE = "BSD-2-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=0c79f8d3c91fc847350efd28bfe0a341"
 
-SRC_URI[md5sum] = "dcdf0d4f84f4f6ea02ad3f15dfcff2d9"
-SRC_URI[sha256sum] = "02f2a72698453f722b102562eb6430d2a82d6c6c40f2b991ed69e7628142de6a"
+SRC_URI[md5sum] = "d6a85d958aea9277c1728c77dcf063a1"
+SRC_URI[sha256sum] = "1d91a0059d2d8bb980bec169578035c2f2d4b93cd8a4fb5b85c81904d33e221a"
 
 PYPI_PACKAGE = "sentry-sdk"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-smbus_4.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-smbus_4.1.bb
index 1be7739..6b33649 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-smbus_4.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-smbus_4.1.bb
@@ -9,5 +9,5 @@
 
 DEPENDS += "i2c-tools"
 
-S = "${WORKDIR}/i2c-tools-${PV}/py-smbus/"
+S = "${WORKDIR}/i2c-tools-${PV}/py-smbus"
 inherit distutils3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.49.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.50.2.bb
similarity index 65%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.49.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.50.2.bb
index 26eb107..9c2d06b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.49.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.50.2.bb
@@ -5,8 +5,8 @@
 LICENSE = "MIT & MPL-2.0"
 LIC_FILES_CHKSUM = "file://LICENCE;md5=7ea57584e3f8bbde2ae3e1537551de25"
 
-SRC_URI[md5sum] = "c2afde3f1d5aa108376fdd0f4b20821d"
-SRC_URI[sha256sum] = "faf9c671bd3fad5ebaeee366949d969dca2b2be32c872a7092a1e1a9048d105b"
+SRC_URI[md5sum] = "2e56a15d28aa1fa06eeb31031c16c1f3"
+SRC_URI[sha256sum] = "69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.6.bb
similarity index 68%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.6.bb
index e2a3044..f331403 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.6.bb
@@ -8,7 +8,7 @@
 
 PYPI_PACKAGE = "XlsxWriter"
 
-SRC_URI[md5sum] = "7c7191afe3149e41dca0e17d535421fb"
-SRC_URI[sha256sum] = "830cad0a88f0f95e5a8945ee082182aa68ab89e7d9725d0c32c196207634244b"
+SRC_URI[md5sum] = "378642a3754fb233e418e3869cf051bb"
+SRC_URI[sha256sum] = "b89002dea57bb3d4c8207f3e28ef8244bfd9e936b85d74e7dd1f97e11bb70313"
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.5.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.0.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.5.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.0.bb
index 40f0e4d..543acc5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.5.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.0.bb
@@ -3,8 +3,8 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b334fc90d45983db318f54fd5bf6c90b"
 
-SRC_URI[md5sum] = "a9b20bf0b8a6962e1101b28908a67bf8"
-SRC_URI[sha256sum] = "c22c75b5f394f3d47105045ea551e08a3e804dc7e01b37800ca35b58f856c3d6"
+SRC_URI[md5sum] = "802bb27ebdb260fbbaecbcc8168d6f28"
+SRC_URI[sha256sum] = "61d3ea3c175fe45f1498af868879c6ffeb989d4143ac542163c45538ba5ec21b"
 
 SRC_URI += " \
     file://run-ptest \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.3.0.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.1.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.3.0.bb
index a29e298..746f9ce 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.1.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-zipp_3.3.0.bb
@@ -3,8 +3,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=7a7126e068206290f3fe9f8d6c713ea6"
 
-SRC_URI[md5sum] = "199da7385f080ec45da6c1942e2b5996"
-SRC_URI[sha256sum] = "c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"
+SRC_URI[md5sum] = "87a53f0bf48671f6bf6d3e9938218509"
+SRC_URI[sha256sum] = "64ad89efee774d1897a58607895d80789c59778ea02185dd846ac38394a8642b"
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
 
diff --git a/meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.0.2.bb b/meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.1.0.bb
similarity index 91%
rename from meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.0.2.bb
rename to meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.1.0.bb
index da73198..d68ae9a 100644
--- a/meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-extended/pywbem/python3-pywbem_1.1.0.bb
@@ -16,8 +16,8 @@
 LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24"
 
-SRC_URI[md5sum] = "0f171e365e294554f8e7624ccf511067"
-SRC_URI[sha256sum] = "66d8ec82d30f2b95d8b4bd51659429066c2879d3f46292561f5fdbc7fed10f3d"
+SRC_URI[md5sum] = "6ade0cda6a997542d61f15713c2dd971"
+SRC_URI[sha256sum] = "4e2baa4b4b88943cca32c7eb588fffff22ce86c748ba7544e01149f9638014fe"
 
 inherit pypi setuptools3 update-alternatives
 
diff --git a/meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.1.bb b/meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.3.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.1.bb
rename to meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.3.bb
index 05f7728..8620057 100644
--- a/meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.1.bb
+++ b/meta-openembedded/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_0.7.3.bb
@@ -4,8 +4,8 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa"
 
-SRC_URI[md5sum] = "a789da735c04ddc08ba828cd8022243e"
-SRC_URI[sha256sum] = "d2fe776c78a740215142f4f033055093f2283fd9327440c59734716e51e19989"
+SRC_URI[md5sum] = "e3f8cadb8d1253b1b51afabcce4c3461"
+SRC_URI[sha256sum] = "b475da4389ac77901191c886f4348660f3c0fd59365feb18ede47a086442efff"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.1.bb b/meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.2.bb
similarity index 84%
rename from meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.1.bb
rename to meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.2.bb
index aed5ce4..5476b20 100644
--- a/meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.1.bb
+++ b/meta-openembedded/meta-xfce/recipes-apps/xfce4-notifyd/xfce4-notifyd_0.6.2.bb
@@ -14,8 +14,7 @@
 
 inherit xfce-app
 
-SRC_URI[md5sum] = "58e70621d6b9e0e66399ed41ab402a47"
-SRC_URI[sha256sum] = "9b5274999c89bf296a7de03b375e8233eef37940b7444502130b92dfb6a089b4"
+SRC_URI[sha256sum] = "19ab84c6665c7819998f2269322d53f462c30963ce26042df23ae525e7d16545"
 
 # Avoid trouble with other desktops e.g KDE which also ships dbus service named
 # org.freedesktop.Notifications