On 21/08/2009 00:40, Yaakov (Cygwin/X) wrote: > On 04/08/2009 13:58, Reini Urban wrote: >> Rather than stripping our exe's and dll's I suggest to strip the debug >> info into >> seperate /usr/lib/debug/path/file.dbg and package them seperately in >> -debuginfo >> packages such as with fedora.
FWIW, attached is the patch I've been using to do this, based on Reini's patch, updated to address some of your concerns. This can, as you suggested, strip the symbols to a location outside of ${D} and create a single debuginfo package containing those symbols for each cygport. I know that support for these packages in upset and setup has been rejected by cgf, but it's still useful to me to keep the debuginfo for the packaged builds of Xwin around. > 1) Right now, cygport default CFLAGS="-O2 -pipe". Adding -g is easy enough, > but how will -O2 affect the debug info? (We really don't want to use -O0 for > distro packages, do we?) The debug info can correctly reflect optimizations that have taken place (e.g. variables that have been optimized out or source lines that have been become interleaved) > 2) I know that on Linux, -fomit-frame-pointer breaks debugging on x86 (but not > on amd64 or other arches). Some packages add this themselves for > optimization, and some outright need it for their asm code (ffmpeg comes to > mind). We then have a question of performance vs. debugging, so if you can > only have one, which takes priority? > > 3) Is using /usr/lib/debug feasible? I've only ever seen .dbg files placed in > the same directory as the .exe/.dll. gdb seems to know to look in /usr/lib/debug/<pathname> for the symbols for <pathname>.
>From de7c4824c7d839ff4deacf0772c27de46a753b56 Mon Sep 17 00:00:00 2001 From: Jon TURNEY <jon.tur...@dronecode.org.uk> Date: Wed, 11 Jan 2012 14:45:09 +0000 Subject: [PATCH] Add the ability to preseve debug information in a separate debuginfo archive based on a patch by Reini Urban http://cygwin.com/ml/cygwin/2009-08/msg00124.html If _CYGPORT_RESTRICT_debug_ is defined, instead of stripping executable files, split the debug info into .dbg files placed into /usr/lib/debug, and then assemble those files into a debuginfo archive. Signed-off-by: Jon TURNEY <jon.tur...@dronecode.org.uk> --- bin/cygport.in | 5 ++++- lib/pkg_pkg.cygpart | 14 +++++++++++++- lib/src_postinst.cygpart | 29 +++++++++++++++++++++++++++-- lib/src_prep.cygpart | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/bin/cygport.in b/bin/cygport.in index a3625bb..2b754a5 100755 --- a/bin/cygport.in +++ b/bin/cygport.in @@ -460,6 +460,7 @@ declare -r logdir="${workdir}/log"; declare -r patchdir="${workdir}/patch"; declare -r spkgdir="${workdir}/spkg"; declare -r distdir="${workdir}/dist"; +declare -r dbgdir="${workdir}/dbg"; SRC_DIR=${SRC_DIR:-${ORIG_PN:-${PN}}-${PV}}; if [ "x${SRC_DIR}" = "x." ] @@ -530,6 +531,8 @@ declare -r src_patchfile=${PF}.src.patch; declare -ar pkg_name=(${PKG_NAMES:-${PN}}); declare -r pkg_count=${#pkg_name[*]}; +declare -r dbgpath=/usr/lib/debug + ################################################################################ # # Command processing @@ -593,7 +596,7 @@ do package|pkg) __stage Packaging; __log_init ${pkglog}; - (__pkg_binpkg && __pkg_pkgcheck && __pkg_srcpkg && __pkg_dist) 2>&1 | tee -a ${pkglog}; + (__pkg_binpkg && __pkg_pkgcheck && __pkg_srcpkg && __pkg_dbgpkg && __pkg_dist) 2>&1 | tee -a ${pkglog}; _status=$?; ;; diff|mkdiff|mkpatch) diff --git a/lib/pkg_pkg.cygpart b/lib/pkg_pkg.cygpart index e4df744..1cac55c 100644 --- a/lib/pkg_pkg.cygpart +++ b/lib/pkg_pkg.cygpart @@ -399,5 +399,17 @@ __pkg_dist() { fi } +__pkg_dbgpkg() { + if defined _CYGPORT_RESTRICT_debug_ + then + + echo; + __step "Creating debuginfo package"; + + cd ${dbgdir}; + tar jcvf ${top}/${PF}-debuginfo.tar.bz2 * || error "Debuginfo package creation failed" + fi +} + # protect functions -readonly -f __pkg_binpkg __pkg_diff __gpg_sign __pkg_srcpkg __pkg_dist +readonly -f __pkg_dbgpkg __pkg_binpkg __pkg_diff __gpg_sign __pkg_srcpkg __pkg_dist diff --git a/lib/src_postinst.cygpart b/lib/src_postinst.cygpart index afc97b6..0582985 100644 --- a/lib/src_postinst.cygpart +++ b/lib/src_postinst.cygpart @@ -542,7 +542,13 @@ __prepstrip() { cd ${D}; - echo "Stripping executables:"; + if defined _CYGPORT_RESTRICT_debug_ + then + echo "Creating debug files, stripping executables and adding debuglink:"; + rm -fr ${dbgdir}/*; + else + echo "Stripping executables:"; + fi # *.so: Apache2 modules, OCaml stublibs, Ruby modules # *.oct: Octave modules @@ -609,7 +615,26 @@ __prepstrip() { echo " ${exe}"; chmod 0755 ${exe}; - ${strip} ${exe}; + + # ensure this is actually a PE-COFF object + if ${OBJDUMP} -f ${exe} &>/dev/null + then + if defined _CYGPORT_RESTRICT_debug_ + then + pathname=$(dirname ${exe}) + dbg=$(basename ${exe%.*}).dbg + mkdir -p ${dbgdir}${dbgpath}/${pathname} + # objcopy requires the file we are debuglinking with exists, so make it here and then move it under ${dbgdir} + # gdb has the intelligence to look in ${dbgpath}/${pathname}/ for the .dbg file, so we don't need to give the full path + objcopy --only-keep-debug ${exe} ${dbg} + objcopy --strip-debug ${exe} + objcopy --add-gnu-debuglink=${dbg} ${exe} + mv ${dbg} ${dbgdir}${dbgpath}/${pathname}/ + else + ${strip} ${exe}; + fi + fi + done } diff --git a/lib/src_prep.cygpart b/lib/src_prep.cygpart index 5d64408..59d4f24 100644 --- a/lib/src_prep.cygpart +++ b/lib/src_prep.cygpart @@ -198,7 +198,7 @@ __gpg_verify() { __mkdirs() { cd ${top}; - mkdir -p ${srcdir} ${origsrcdir} ${B} ${D} ${T} ${configdir} ${logdir} ${distdir} ${patchdir} ${spkgdir}; + mkdir -p ${srcdir} ${origsrcdir} ${B} ${D} ${T} ${configdir} ${logdir} ${distdir} ${patchdir} ${spkgdir} ${dbgdir}; } cygpatch() { -- 1.7.5.1
-- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple