ld: Move the .note.build-id section to near the start of the memory map.

This helps GDB to locate the debug information associated with a core dump.
Core dumps include the first page of an executable's image, and if this
page include the .note.build-id section then GDB can find it and then track
down a debug info file for that build-id.
This commit is contained in:
Nick Clifton
2024-09-19 16:45:30 +01:00
parent b6532accdd
commit bf6d7087de

View File

@@ -397,6 +397,19 @@ fi
# =========================================================================== # ===========================================================================
# Functions for generating parts of the linker script # Functions for generating parts of the linker script
# Helper function for putting comments into scripts.
# Useful when trying to track down script composition problems.
# Use by adding:
# emit_comment "a message"
# wherever necessary.
emit_comment()
{
cat <<EOF
/* $1 */
EOF
}
emit_header() emit_header()
{ {
cat <<EOF cat <<EOF
@@ -425,7 +438,6 @@ emit_early_ro()
{ {
cat <<EOF cat <<EOF
${INITIAL_READONLY_SECTIONS} ${INITIAL_READONLY_SECTIONS}
.note.gnu.build-id ${RELOCATING-0}: { *(.note.gnu.build-id) }
EOF EOF
} }
@@ -436,6 +448,11 @@ cat <<EOF
${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}} ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}} ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}}
${CREATE_PIE+${RELOCATING+PROVIDE (__executable_start = ${SHLIB_TEXT_START_ADDR}); . = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}} ${CREATE_PIE+${RELOCATING+PROVIDE (__executable_start = ${SHLIB_TEXT_START_ADDR}); . = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}}
/* Place build-id as close to the ELF headers as possible. This
maximises the chance the build-id will be present in core files,
which GDB can then use to locate the associated debuginfo file. */
.note.gnu.build-id ${RELOCATING-0}: { *(.note.gnu.build-id) }
EOF EOF
} }
@@ -557,6 +574,7 @@ EOF
align_text() align_text()
{ {
cat <<EOF cat <<EOF
${RELOCATING+/* Align the text segment. */}
${RELOCATING+${TEXT_SEGMENT_ALIGN}} ${RELOCATING+${TEXT_SEGMENT_ALIGN}}
EOF EOF
} }
@@ -798,11 +816,28 @@ EOF
emit_executable_start emit_executable_start
if test -z "${ALL_TEXT_BEFORE_RO}"; then if test -z "${ALL_TEXT_BEFORE_RO}"; then
# We are allowed to put R/O sections before code sections.
test -n "${SEPARATE_CODE}" || emit_early_ro test -n "${SEPARATE_CODE}" || emit_early_ro
test -n "${NON_ALLOC_DYN}${SEPARATE_CODE}" || emit_dyn test -n "${NON_ALLOC_DYN}${SEPARATE_CODE}" || emit_dyn
# We only need the alignment if we have emitted some sections.
if test -z "${SEPARATE_CODE}"; then
align_text
elif test -z "${NON_ALLOC_DYN}${SEPARATE_CODE}"; then
align_text
fi
fi fi
align_text # We do not align the code segment here as doing so will increase the file size.
# Normally having the text segment at the start of the file will automatically
# mean that it is aligned(*), and if we have emitted any r/o sections due to the
# tests of SEPARATE_CODE above, then extra alignment will have already been
# generated.
#
# *: Including the ELF headers and .note.gnu.build-id section in the code segment
# is a very small theoretical risk.
emit_text emit_text
align_rodata align_rodata