@@ -35,6 +35,11 @@ prelink_image () {
dynamic_loader=$(linuxloader)
+ if [ "$IMAGE_GEN_COMBINED_DEBUGFS" = "1" ]; then
+ cp ${IMAGE_ROOTFS}${sysconfdir}/prelink.conf ${IMAGE_ROOTFS}-dbg${sysconfdir}/prelink.conf
+ cp ${IMAGE_ROOTFS}${sysconfdir}/ld.so.conf ${IMAGE_ROOTFS}-dbg${sysconfdir}/ld.so.conf
+ fi
+
# prelink!
if [ "$BUILD_REPRODUCIBLE_BINARIES" = "1" ]; then
bbnote " prelink: BUILD_REPRODUCIBLE_BINARIES..."
@@ -44,8 +49,16 @@ prelink_image () {
export PRELINK_TIMESTAMP=$REPRODUCIBLE_TIMESTAMP_ROOTFS
fi
${STAGING_SBINDIR_NATIVE}/prelink --root ${IMAGE_ROOTFS} -am -N -c ${sysconfdir}/prelink.conf --dynamic-linker $dynamic_loader
+ if [ "$IMAGE_GEN_COMBINED_DEBUGFS" = "1" ]; then
+ bbnote " prelink: IMAGE_GEN_COMBINED_DEBUGFS..."
+ ${STAGING_SBINDIR_NATIVE}/prelink --root ${IMAGE_ROOTFS}-dbg -am -N -c ${sysconfdir}/prelink.conf --dynamic-linker $dynamic_loader
+ fi
else
${STAGING_SBINDIR_NATIVE}/prelink --root ${IMAGE_ROOTFS} -amR -N -c ${sysconfdir}/prelink.conf --dynamic-linker $dynamic_loader
+ if [ "$IMAGE_GEN_COMBINED_DEBUGFS" = "1" ]; then
+ bbnote " prelink: IMAGE_GEN_COMBINED_DEBUGFS..."
+ ${STAGING_SBINDIR_NATIVE}/prelink --root ${IMAGE_ROOTFS}-dbg -amR -N -c ${sysconfdir}/prelink.conf --dynamic-linker $dynamic_loader
+ fi
fi
# Remove the prelink.conf if we had to add it.
@@ -28,6 +28,12 @@ IMAGE_FEATURES[validitems] += "debug-tweaks read-only-rootfs empty-root-password
# Generate companion debugfs?
IMAGE_GEN_DEBUGFS ?= "0"
+# Generate companion combined debugfs? The difference from IMAGE_GEN_DEBUGFS
+# is that in case of IMAGE_GEN_COMBINED_DEBUGFS resulting debufs contains full
+# copy of original symbols plus -dbg packages, whereas in case of IMAGE_GEN_DEBUGFS
+# it contains only -dbg packages
+IMAGE_GEN_COMBINED_DEBUGFS ?= "0"
+
# rootfs bootstrap install
ROOTFS_BOOTSTRAP_INSTALL = "run-postinsts"
@@ -117,7 +123,7 @@ def rootfs_variables(d):
'IMAGE_ROOTFS_MAXSIZE','IMAGE_NAME','IMAGE_LINK_NAME','IMAGE_MANIFEST','DEPLOY_DIR_IMAGE','IMAGE_FSTYPES','IMAGE_INSTALL_COMPLEMENTARY','IMAGE_LINGUAS',
'MULTILIBRE_ALLOW_REP','MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS',
'PACKAGE_ARCHS','PACKAGE_CLASSES','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS',
- 'CONVERSIONTYPES', 'IMAGE_GEN_DEBUGFS', 'ROOTFS_RO_UNNEEDED', 'IMGDEPLOYDIR', 'PACKAGE_EXCLUDE_COMPLEMENTARY', 'REPRODUCIBLE_TIMESTAMP_ROOTFS']
+ 'CONVERSIONTYPES', 'IMAGE_GEN_DEBUGFS', 'IMAGE_GEN_COMBINED_DEBUGFS', 'ROOTFS_RO_UNNEEDED', 'IMGDEPLOYDIR', 'PACKAGE_EXCLUDE_COMPLEMENTARY', 'REPRODUCIBLE_TIMESTAMP_ROOTFS']
variables.extend(rootfs_command_variables(d))
variables.extend(variable_depends(d))
return " ".join(variables)
@@ -268,6 +274,7 @@ fakeroot python do_image () {
from oe.utils import execute_pre_post_process
d.setVarFlag('REPRODUCIBLE_TIMESTAMP_ROOTFS', 'export', '1')
+ d.setVarFlag('IMAGE_GEN_COMBINED_DEBUGFS', 'export', '1')
pre_process_cmds = d.getVar("IMAGE_PREPROCESS_COMMAND")
execute_pre_post_process(d, pre_process_cmds)
@@ -381,7 +388,7 @@ python () {
alltypes = d.getVar('IMAGE_FSTYPES').split()
typedeps = {}
- if d.getVar('IMAGE_GEN_DEBUGFS') == "1":
+ if d.getVar('IMAGE_GEN_DEBUGFS') == "1" or d.getVar('IMAGE_GEN_COMBINED_DEBUGFS') == "1" :
debugfs_fstypes = d.getVar('IMAGE_FSTYPES_DEBUGFS').split()
for t in debugfs_fstypes:
alltypes.append("debugfs_" + t)
@@ -107,7 +107,9 @@ class Rootfs(object, metaclass=ABCMeta):
def _setup_dbg_rootfs(self, dirs):
gen_debugfs = self.d.getVar('IMAGE_GEN_DEBUGFS') or '0'
- if gen_debugfs != '1':
+ gen_combined_debugfs = self.d.getVar('IMAGE_GEN_COMBINED_DEBUGFS') or '0'
+
+ if gen_debugfs != '1' and gen_combined_debugfs != '1':
return
bb.note(" Renaming the original rootfs...")
@@ -118,32 +120,37 @@ class Rootfs(object, metaclass=ABCMeta):
os.rename(self.image_rootfs, self.image_rootfs + '-orig')
bb.note(" Creating debug rootfs...")
- bb.utils.mkdirhier(self.image_rootfs)
- bb.note(" Copying back package database...")
- for dir in dirs:
- if not os.path.isdir(self.image_rootfs + '-orig' + dir):
- continue
- bb.utils.mkdirhier(self.image_rootfs + os.path.dirname(dir))
- shutil.copytree(self.image_rootfs + '-orig' + dir, self.image_rootfs + dir, symlinks=True)
-
- cpath = oe.cachedpath.CachedPath()
- # Copy files located in /usr/lib/debug or /usr/src/debug
- for dir in ["/usr/lib/debug", "/usr/src/debug"]:
- src = self.image_rootfs + '-orig' + dir
- if cpath.exists(src):
- dst = self.image_rootfs + dir
- bb.utils.mkdirhier(os.path.dirname(dst))
- shutil.copytree(src, dst)
-
- # Copy files with suffix '.debug' or located in '.debug' dir.
- for root, dirs, files in cpath.walk(self.image_rootfs + '-orig'):
- relative_dir = root[len(self.image_rootfs + '-orig'):]
- for f in files:
- if f.endswith('.debug') or '/.debug' in relative_dir:
- bb.utils.mkdirhier(self.image_rootfs + relative_dir)
- shutil.copy(os.path.join(root, f),
- self.image_rootfs + relative_dir)
+ if gen_combined_debugfs != '1':
+ bb.utils.mkdirhier(self.image_rootfs)
+
+ bb.note(" Copying back package database...")
+ for dir in dirs:
+ if not os.path.isdir(self.image_rootfs + '-orig' + dir):
+ continue
+ bb.utils.mkdirhier(self.image_rootfs + os.path.dirname(dir))
+ shutil.copytree(self.image_rootfs + '-orig' + dir, self.image_rootfs + dir, symlinks=True)
+
+ cpath = oe.cachedpath.CachedPath()
+ # Copy files located in /usr/lib/debug or /usr/src/debug
+ for dir in ["/usr/lib/debug", "/usr/src/debug"]:
+ src = self.image_rootfs + '-orig' + dir
+ if cpath.exists(src):
+ dst = self.image_rootfs + dir
+ bb.utils.mkdirhier(os.path.dirname(dst))
+ shutil.copytree(src, dst)
+
+ # Copy files with suffix '.debug' or located in '.debug' dir.
+ for root, dirs, files in cpath.walk(self.image_rootfs + '-orig'):
+ relative_dir = root[len(self.image_rootfs + '-orig'):]
+ for f in files:
+ if f.endswith('.debug') or '/.debug' in relative_dir:
+ bb.utils.mkdirhier(self.image_rootfs + relative_dir)
+ shutil.copy(os.path.join(root, f),
+ self.image_rootfs + relative_dir)
+ else:
+ bb.note(" Copying back original image...")
+ shutil.copytree(self.image_rootfs + '-orig', self.image_rootfs, symlinks=True)
bb.note(" Install complementary '*-dbg' packages...")
self.pm.install_complementary('*-dbg')
There is IMAGE_GEN_DEBUGFS="1" variable that enables build of additional rootfs-dbg and additional archive that contains complimentary symbols files for a given image. But the issue with this resulting directory and tarball that before use it has to be combined with original image content. It is required since all cross debugging tools like gdb, perf, and systemtap need file system that contains both target executables/libraries and their symbols. Those tools need to find executable/library first and through it debuglink note find corresponding symbols file. IMAGE_GEN_DEBUGFS="1" variable as storage strategy may have some sense it removes duplicate content, but from engineer work flow point of view it requires extra steps of recombining, unpacking two tarball archives. I.e there is no directory in image build workspace that can be used to run gdb, perf, and systemtap. In addition to IMAGE_GEN_DEBUGFS variable new variant of the same functionality IMAGE_GEN_COMBINED_DEBUGFS is introduced. Unlike IMAGE_GEN_DEBUGFS additional rootfs-dbg and additional tarball would contain both all target material plus symbols. Resulting rootfs-dbg directory in build workspace can be directly used by all cross debugging tools like gdb, perf, and systemtap. Signed-off-by: Victor Kamensky <kamensky@cisco.com> --- meta/classes/image-prelink.bbclass | 13 +++++++++ meta/classes/image.bbclass | 11 +++++-- meta/lib/oe/rootfs.py | 59 +++++++++++++++++++++----------------- 3 files changed, 55 insertions(+), 28 deletions(-) -- 2.7.4 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core