scripts/build/debug/300-gdb.sh
author "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
Wed May 25 20:23:48 2011 +0200 (2011-05-25)
changeset 2476 7690196856ce
parent 2344 7b6d5c5316ab
child 2490 cce067f0448e
permissions -rw-r--r--
debug/gdb: fix runtime sysroot

This patch sets the runtime sysroot to fix the following GDB warning:
"Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code."

The sysroot can later be changed within gdb with the `set sysroot`
command if necessary.

Signed-off-by: "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
     1 # Build script for the gdb debug facility
     2 
     3 # The version of ncurses to use. Yes, it's hard-coded.
     4 # It's used only internally by crosstool-NG, and is
     5 # not exposed outside, so we don't care about providing
     6 # config options for this.
     7 CT_DEBUG_GDB_NCURSES_VERSION="5.7"
     8 
     9 # Ditto for the expat library
    10 CT_DEBUG_GDB_EXPAT_VERSION="2.0.1"
    11 
    12 do_debug_gdb_parts() {
    13     do_gdb=
    14     do_ncurses=
    15     do_expat=
    16 
    17     if [ "${CT_GDB_CROSS}" = y ]; then
    18         do_gdb=y
    19     fi
    20 
    21     if [ "${CT_GDB_GDBSERVER}" = "y" ]; then
    22         do_gdb=y
    23     fi
    24 
    25     if [ "${CT_GDB_NATIVE}" = "y" ]; then
    26         do_gdb=y
    27         # GDB on Mingw depends on PDcurses, not ncurses
    28         if [ "${CT_MINGW32}" != "y" ]; then
    29             do_ncurses=y
    30         fi
    31         do_expat=y
    32     fi
    33 }
    34 
    35 do_debug_gdb_get() {
    36     local linaro_version
    37     local linaro_series
    38     local linaro_base_url="http://launchpad.net/gdb-linaro"
    39 
    40     # Account for the Linaro versioning
    41     linaro_version="$( echo "${CT_GDB_VERSION}"      \
    42                        |sed -r -e 's/^linaro-//;'   \
    43                      )"
    44     linaro_series="$( echo "${linaro_version}"      \
    45                       |sed -r -e 's/-.*//;'         \
    46                     )"
    47 
    48     do_debug_gdb_parts
    49 
    50     if [ "${do_gdb}" = "y" ]; then
    51         CT_GetFile "gdb-${CT_GDB_VERSION}"                          \
    52                    {ftp,http}://ftp.gnu.org/pub/gnu/gdb             \
    53                    ftp://sources.redhat.com/pub/gdb/{,old-}releases \
    54                    "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
    55     fi
    56 
    57     if [ "${do_ncurses}" = "y" ]; then
    58         CT_GetFile "ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}" .tar.gz  \
    59                    {ftp,http}://ftp.gnu.org/pub/gnu/ncurses \
    60                    ftp://invisible-island.net/ncurses
    61     fi
    62 
    63     if [ "${do_expat}" = "y" ]; then
    64         CT_GetFile "expat-${CT_DEBUG_GDB_EXPAT_VERSION}" .tar.gz    \
    65                    http://mesh.dl.sourceforge.net/sourceforge/expat/expat/${CT_DEBUG_GDB_EXPAT_VERSION}
    66     fi
    67 }
    68 
    69 do_debug_gdb_extract() {
    70     do_debug_gdb_parts
    71 
    72     if [ "${do_gdb}" = "y" ]; then
    73         CT_Extract "gdb-${CT_GDB_VERSION}"
    74         CT_Patch "gdb" "${CT_GDB_VERSION}"
    75     fi
    76 
    77     if [ "${do_ncurses}" = "y" ]; then
    78         CT_Extract "ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}"
    79         CT_DoExecLog ALL chmod -R u+w "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}"
    80         CT_Patch "ncurses" "${CT_DEBUG_GDB_NCURSES_VERSION}"
    81     fi
    82 
    83     if [ "${do_expat}" = "y" ]; then
    84         CT_Extract "expat-${CT_DEBUG_GDB_EXPAT_VERSION}"
    85         CT_Patch "expat" "${CT_DEBUG_GDB_EXPAT_VERSION}"
    86     fi
    87 }
    88 
    89 do_debug_gdb_build() {
    90     local -a extra_config
    91 
    92     do_debug_gdb_parts
    93 
    94     gdb_src_dir="${CT_SRC_DIR}/gdb-${CT_GDB_VERSION}"
    95 
    96     # Version 6.3 and below behave badly with gdbmi
    97     case "${CT_GDB_VERSION}" in
    98         6.2*|6.3)   extra_config+=("--disable-gdbmi");;
    99     esac
   100 
   101     if [ "${CT_GDB_CROSS}" = "y" ]; then
   102         local -a cross_extra_config
   103 
   104         CT_DoStep INFO "Installing cross-gdb"
   105         CT_DoLog EXTRA "Configuring cross-gdb"
   106 
   107         mkdir -p "${CT_BUILD_DIR}/build-gdb-cross"
   108         cd "${CT_BUILD_DIR}/build-gdb-cross"
   109 
   110         cross_extra_config=("${extra_config[@]}")
   111         case "${CT_THREADS}" in
   112             none)   cross_extra_config+=("--disable-threads");;
   113             *)      cross_extra_config+=("--enable-threads");;
   114         esac
   115 
   116         CC_for_gdb=
   117         LD_for_gdb=
   118         if [ "${CT_GDB_CROSS_STATIC}" = "y" ]; then
   119             CC_for_gdb="gcc -static"
   120             LD_for_gdb="ld -static"
   121         fi
   122 
   123         gdb_cross_configure="${gdb_src_dir}/configure"
   124 
   125         CT_DoLog DEBUG "Extra config passed: '${cross_extra_config[*]}'"
   126 
   127         CT_DoExecLog CFG                                \
   128         CC="${CC_for_gdb}"                              \
   129         LD="${LD_for_gdb}"                              \
   130         "${gdb_cross_configure}"                        \
   131             --build=${CT_BUILD}                         \
   132             --host=${CT_HOST}                           \
   133             --target=${CT_TARGET}                       \
   134             --prefix="${CT_PREFIX_DIR}"                 \
   135             --with-build-sysroot="${CT_SYSROOT_DIR}"    \
   136             --with-sysroot="${CT_SYSROOT_DIR}"          \
   137             --disable-werror                            \
   138             "${cross_extra_config[@]}"
   139 
   140         CT_DoLog EXTRA "Building cross-gdb"
   141         CT_DoExecLog ALL make ${JOBSFLAGS}
   142 
   143         CT_DoLog EXTRA "Installing cross-gdb"
   144         CT_DoExecLog ALL make install
   145 
   146         CT_EndStep
   147     fi
   148 
   149     if [ "${CT_GDB_NATIVE}" = "y" ]; then
   150         local -a native_extra_config
   151         local -a ncurses_opt
   152         local -a gdb_native_CFLAGS
   153 
   154         CT_DoStep INFO "Installing native gdb"
   155 
   156         native_extra_config=("${extra_config[@]}")
   157 
   158         # GDB on Mingw depends on PDcurses, not ncurses
   159         if [ "${do_ncurses}" = "y" ]; then
   160             CT_DoLog EXTRA "Building static target ncurses"
   161 
   162             [ "${CT_CC_LANG_CXX}" = "y" ] || ncurses_opts+=("--without-cxx" "--without-cxx-binding")
   163             [ "${CT_CC_LANG_ADA}" = "y" ] || ncurses_opts+=("--without-ada")
   164 
   165             mkdir -p "${CT_BUILD_DIR}/build-ncurses-build-tic"
   166             cd "${CT_BUILD_DIR}/build-ncurses-build-tic"
   167 
   168             # Use build = CT_REAL_BUILD so that configure thinks it is
   169             # cross-compiling, and thus will use the ${CT_BUILD}-*
   170             # tools instead of searching for the native ones...
   171             CT_DoExecLog CFG                                                    \
   172             "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}/configure"   \
   173                 --build=${CT_BUILD}                                             \
   174                 --host=${CT_BUILD}                                              \
   175                 --prefix=/usr                                                   \
   176                 --without-shared                                                \
   177                 --enable-symlinks                                               \
   178                 --with-build-cc=${CT_REAL_BUILD}-gcc                            \
   179                 --with-build-cpp=${CT_REAL_BUILD}-gcc                           \
   180                 --with-build-cflags="${CT_CFLAGS_FOR_HOST}"                     \
   181                 "${ncurses_opts[@]}"
   182 
   183             # Under some operating systems (eg. Winblows), there is an
   184             # extension appended to executables. Find that.
   185             tic_ext=$(grep -E '^x[[:space:]]*=' progs/Makefile |sed -r -e 's/^.*=[[:space:]]*//;')
   186 
   187             CT_DoExecLog ALL make ${JOBSFLAGS} -C include
   188             CT_DoExecLog ALL make ${JOBSFLAGS} -C progs "tic${tic_ext}"
   189 
   190             CT_DoExecLog ALL install -d -m 0755 "${CT_PREFIX_DIR}/buildtools"
   191             CT_DoExecLog ALL install -m 0755 "progs/tic${tic_ext}" "${CT_PREFIX_DIR}/buildtools"
   192 
   193             mkdir -p "${CT_BUILD_DIR}/build-ncurses"
   194             cd "${CT_BUILD_DIR}/build-ncurses"
   195 
   196             CT_DoExecLog CFG                                                    \
   197             "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}/configure"   \
   198                 --build=${CT_BUILD}                                             \
   199                 --host=${CT_TARGET}                                             \
   200                 --with-build-cc=${CT_BUILD}-gcc                                 \
   201                 --with-build-cpp=${CT_BUILD}-gcc                                \
   202                 --with-build-cflags="${CT_CFLAGS_FOR_HOST}"                     \
   203                 --prefix="${CT_BUILD_DIR}/static-target"                        \
   204                 --without-shared                                                \
   205                 --without-sysmouse                                              \
   206                 --without-progs                                                 \
   207                 --enable-termcap                                                \
   208                 "${ncurses_opts[@]}"
   209 
   210             CT_DoExecLog ALL make ${JOBSFLAGS}
   211 
   212             CT_DoExecLog ALL make install
   213 
   214             # We no longer need the temporary tic. Remove it
   215             CT_DoExecLog DEBUG rm -fv "${CT_PREFIX_DIR}/buildtools/tic${tic_ext}"
   216 
   217             native_extra_config+=("--with-curses")
   218             # There's no better way to tell gdb where to find -lcurses... :-(
   219             gdb_native_CFLAGS+=("-I${CT_BUILD_DIR}/static-target/include")
   220             gdb_native_CFLAGS+=("-L${CT_BUILD_DIR}/static-target/lib")
   221         fi # do_ncurses
   222 
   223         if [ "${do_expat}" = "y" ]; then
   224             CT_DoLog EXTRA "Building static target expat"
   225 
   226             mkdir -p "${CT_BUILD_DIR}/expat-build"
   227             cd "${CT_BUILD_DIR}/expat-build"
   228 
   229             CT_DoExecLog CFG                                                \
   230             "${CT_SRC_DIR}/expat-${CT_DEBUG_GDB_EXPAT_VERSION}/configure"   \
   231                 --build=${CT_BUILD}                                         \
   232                 --host=${CT_TARGET}                                         \
   233                 --prefix="${CT_BUILD_DIR}/static-target"                    \
   234                 --enable-static                                             \
   235                 --disable-shared
   236 
   237             CT_DoExecLog ALL make ${JOBSFLAGS}
   238             CT_DoExecLog ALL make install
   239 
   240             native_extra_config+=("--with-expat")
   241             native_extra_config+=("--with-libexpat-prefix=${CT_BUILD_DIR}/static-target")
   242         fi # do_expat
   243 
   244         CT_DoLog EXTRA "Configuring native gdb"
   245 
   246         mkdir -p "${CT_BUILD_DIR}/build-gdb-native"
   247         cd "${CT_BUILD_DIR}/build-gdb-native"
   248 
   249         case "${CT_THREADS}" in
   250             none)   native_extra_config+=("--disable-threads");;
   251             *)      native_extra_config+=("--enable-threads");;
   252         esac
   253 
   254         if [ "${CT_GDB_NATIVE_STATIC}" = "y" ]; then
   255             CC_for_gdb="${CT_TARGET}-gcc -static"
   256             LD_for_gdb="${CT_TARGET}-ld -static"
   257         else
   258             CC_for_gdb="${CT_TARGET}-gcc"
   259             LD_for_gdb="${CT_TARGET}-ld"
   260         fi
   261 
   262         export ac_cv_func_strncmp_works=yes
   263 
   264         CT_DoLog DEBUG "Extra config passed: '${native_extra_config[*]}'"
   265 
   266         CT_DoExecLog CFG                                \
   267         CC="${CC_for_gdb}"                              \
   268         LD="${LD_for_gdb}"                              \
   269         CFLAGS="${gdb_native_CFLAGS[*]}"                \
   270         "${gdb_src_dir}/configure"                      \
   271             --build=${CT_BUILD}                         \
   272             --host=${CT_TARGET}                         \
   273             --target=${CT_TARGET}                       \
   274             --prefix=/usr                               \
   275             --with-build-sysroot="${CT_SYSROOT_DIR}"    \
   276             --without-uiout                             \
   277             --disable-tui                               \
   278             --disable-gdbtk                             \
   279             --without-x                                 \
   280             --disable-sim                               \
   281             --disable-werror                            \
   282             --without-included-gettext                  \
   283             --without-develop                           \
   284             "${native_extra_config[@]}"
   285 
   286         CT_DoLog EXTRA "Building native gdb"
   287         CT_DoExecLog ALL make ${JOBSFLAGS} CC=${CT_TARGET}-${CT_CC}
   288 
   289         CT_DoLog EXTRA "Installing native gdb"
   290         CT_DoExecLog ALL make DESTDIR="${CT_DEBUGROOT_DIR}" install
   291 
   292         # Building a native gdb also builds a gdbserver
   293         find "${CT_DEBUGROOT_DIR}" -type f -name gdbserver -exec rm -fv {} \; 2>&1 |CT_DoLog ALL
   294 
   295         unset ac_cv_func_strncmp_works
   296 
   297         # GDB on Mingw depends on PDcurses, not ncurses
   298         if [ "${CT_MINGW32}" != "y" ]; then
   299             CT_DoLog EXTRA "Cleaning up ncurses"
   300             cd "${CT_BUILD_DIR}/build-ncurses"
   301             CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" uninstall
   302 
   303             CT_DoExecLog DEBUG rm -rf "${CT_BUILD_DIR}/ncurses"
   304         fi
   305 
   306         CT_EndStep # native gdb build
   307     fi
   308 
   309     if [ "${CT_GDB_GDBSERVER}" = "y" ]; then
   310         local -a gdbserver_extra_config
   311 
   312         CT_DoStep INFO "Installing gdbserver"
   313         CT_DoLog EXTRA "Configuring gdbserver"
   314 
   315         mkdir -p "${CT_BUILD_DIR}/build-gdb-gdbserver"
   316         cd "${CT_BUILD_DIR}/build-gdb-gdbserver"
   317 
   318         # Workaround for bad versions, where the configure
   319         # script for gdbserver is not executable...
   320         # Bah, GNU folks strike again... :-(
   321         chmod +x "${gdb_src_dir}/gdb/gdbserver/configure"
   322 
   323         gdbserver_LDFLAGS=
   324         if [ "${CT_GDB_GDBSERVER_STATIC}" = "y" ]; then
   325             gdbserver_LDFLAGS=-static
   326         fi
   327 
   328         gdbserver_extra_config=("${extra_config[@]}")
   329 
   330         CT_DoExecLog CFG                                \
   331         LDFLAGS="${gdbserver_LDFLAGS}"                  \
   332         "${gdb_src_dir}/gdb/gdbserver/configure"        \
   333             --build=${CT_BUILD}                         \
   334             --host=${CT_TARGET}                         \
   335             --target=${CT_TARGET}                       \
   336             --prefix=/usr                               \
   337             --sysconfdir=/etc                           \
   338             --localstatedir=/var                        \
   339             --includedir="${CT_HEADERS_DIR}"            \
   340             --with-build-sysroot="${CT_SYSROOT_DIR}"    \
   341             --program-prefix=                           \
   342             --without-uiout                             \
   343             --disable-tui                               \
   344             --disable-gdbtk                             \
   345             --without-x                                 \
   346             --without-included-gettext                  \
   347             --without-develop                           \
   348             --disable-werror                            \
   349             "${gdbserver_extra_config[@]}"
   350 
   351         CT_DoLog EXTRA "Building gdbserver"
   352         CT_DoExecLog ALL make ${JOBSFLAGS} CC=${CT_TARGET}-${CT_CC}
   353 
   354         CT_DoLog EXTRA "Installing gdbserver"
   355         CT_DoExecLog ALL make DESTDIR="${CT_DEBUGROOT_DIR}" install
   356 
   357         CT_EndStep
   358     fi
   359 }