diff --git a/meta/classes-recipe/uboot-sign.bbclass b/meta/classes-recipe/uboot-sign.bbclass
index 236d19925e..4743b86dd4 100644
--- a/meta/classes-recipe/uboot-sign.bbclass
+++ b/meta/classes-recipe/uboot-sign.bbclass
@@ -57,6 +57,8 @@ SPL_DTB_SYMLINK ?= "u-boot-spl-${MACHINE}.dtb"
 SPL_NODTB_IMAGE ?= "u-boot-spl-nodtb-${MACHINE}-${PV}-${PR}.bin"
 SPL_NODTB_BINARY ?= "u-boot-spl-nodtb.bin"
 SPL_NODTB_SYMLINK ?= "u-boot-spl-nodtb-${MACHINE}.bin"
+# The SPL image as assembled by U-Boot, before signing.
+SPL_WITH_DTB_BINARY ?= "u-boot-spl-dtb.bin"
 
 # U-Boot fitImage description
 UBOOT_FIT_DESC ?= "U-Boot fitImage for ${DISTRO_NAME}/${PV}/${MACHINE}"
@@ -249,7 +251,23 @@ deploy_dtb() {
 
 concat_spl_dtb() {
 	if [ -e "${SPL_DIR}/${SPL_NODTB_BINARY}" ] && [ -e "${SPL_DIR}/${SPL_DTB_BINARY}" ] ; then
-		cat ${SPL_DIR}/${SPL_NODTB_BINARY} ${SPL_DIR}/${SPL_DTB_SIGNED} > "${SPL_BINARY}"
+		# U-Boot pads behind BSS before appending the device tree
+		# ($(SPL_BIN)-pad.bin in scripts/Makefile.xpl); keep that offset.
+		nodtb_size=$(stat -Lc %s ${SPL_DIR}/${SPL_NODTB_BINARY})
+		dtb_offset=${nodtb_size}
+
+		if [ -e "${SPL_DIR}/${SPL_WITH_DTB_BINARY}" ]; then
+			image_size=$(stat -Lc %s ${SPL_DIR}/${SPL_WITH_DTB_BINARY})
+			dtb_size=$(stat -Lc %s ${SPL_DIR}/${SPL_DTB_BINARY})
+			offset=$(expr ${image_size} - ${dtb_size})
+			if [ ${offset} -gt ${nodtb_size} ]; then
+				dtb_offset=${offset}
+			fi
+		fi
+
+		cp ${SPL_DIR}/${SPL_NODTB_BINARY} "${SPL_BINARY}"
+		truncate -s ${dtb_offset} "${SPL_BINARY}"
+		cat ${SPL_DIR}/${SPL_DTB_SIGNED} >> "${SPL_BINARY}"
 	else
 		bbwarn "Failure while adding public key to spl binary. Verified U-Boot boot won't be available."
 	fi
