'-maccumulate-outgoing-args',
)
+# Debug information has little value in release builds as no normal human being knows
+# how to attach a debugger to EFI binaries running on real hardware. Anyone who does
+# certainly has the means to do their own dev build.
+if get_option('mode') == 'developer' and get_option('debug')
+ efi_c_args += '-DEFI_DEBUG'
+endif
+
efi_c_ld_args = [
# We only support bfd. gold is going away, lld has issues with LTO on x86
# and mold does not support linker scripts.
}
#ifdef EFI_DEBUG
-extern uint8_t _text, _data;
+extern uint8_t __ImageBase;
__attribute__((noinline)) void notify_debugger(const char *identity, volatile bool wait) {
- printf("%s@%p,%p\n", identity, &_text, &_data);
+ printf("%s@%p\n", identity, &__ImageBase);
if (wait)
printf("Waiting for debugger to attach...\n");
exit 1
esac
-# system-boot will print out a line like this to inform us where gdb is supposed to
-# look for .text and .data section:
-# systemd-boot@0x0,0x0
+# system-boot/stub will print out a line like this to inform us where it was loaded:
+# systemd-boot@0xC0DE
while read -r line; do
- if [[ "${line}" =~ ${target}@(0x[[:xdigit:]]+),(0x[[:xdigit:]]+) ]]; then
- text="${BASH_REMATCH[1]}"
- data="${BASH_REMATCH[2]}"
+ if [[ "${line}" =~ ${target}@(0x[[:xdigit:]]+) ]]; then
+ loaded_base="${BASH_REMATCH[1]}"
break
fi
done <"${2}"
-if [[ -z "${text}" || -z "${data}" ]]; then
- echo "Could not determine text and data location."
+if [[ -z "${loaded_base}" ]]; then
+ echo "Could not determine loaded image base."
exit 1
fi
cat >"${gdb_script}" <<EOF
file ${binary}
-add-symbol-file ${symbols} ${text} -s .data ${data}
-set architecture ${arch}"
+symbol-file ${symbols} -o ${loaded_base}
+set architecture ${arch}
EOF
if [[ -z "${3}" ]]; then
SECTIONS {
+ __ImageBase = .;
+
/* We skip the first page because the space will be occupied by the PE headers after conversion. */
. = CONSTANT(MAXPAGESIZE);
.text ALIGN(CONSTANT(MAXPAGESIZE)) : {