summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNigel Croxon <nigel.croxon@hp.com>2015-07-16 12:31:23 -0400
committerNigel Croxon <nigel.croxon@hp.com>2015-07-16 12:31:23 -0400
commit11a459ba967bcdaed8c31c6ce4bbfb7ec54f8233 (patch)
tree5977c041a87d70b8631ca3ae6506ea26173e4037
parentaac405cc66adb9f7c30fb68d9042a7dd8780def8 (diff)
downloadgnu-efi-11a459ba967bcdaed8c31c6ce4bbfb7ec54f8233.tar.gz
This patch makes the following symbols (relatively) consistent between
all of our linker scripts: _text _etext _text_size _data _edata _data_size There are various things that are slightly different (positions of .rela*, .dynamic, and similar in relation to .data), but _text and _data are now always at the beginning of their respective sections with regard to how a debuger would reference the debug info, and _etext and _edata are now always extant and guaranteed to be after any of the respective kind of data the debugger would look for in that section. This also adds an application example of how it might be used, and a makefile target for %.efi.debug which will generate a separate debuginfo file for that example. This also enables debugging by default (i.e. -g is in CFLAGS) and adds .note.gnu.build-id sections to our .so files (i.e. --build-id=sha1 is in LDFLAGS). Signed-off-by: Peter Jones <pjones@redhat.com> Signed-off-by: Nigel Croxon <nigel.croxon@hp.com>
-rw-r--r--.gitignore1
-rw-r--r--Make.defaults7
-rw-r--r--Make.rules6
-rw-r--r--apps/Makefile2
-rw-r--r--apps/debughook.c92
-rw-r--r--gnuefi/elf_aarch64_efi.lds5
-rw-r--r--gnuefi/elf_arm_efi.lds5
-rw-r--r--gnuefi/elf_ia32_efi.lds7
-rw-r--r--gnuefi/elf_ia32_fbsd_efi.lds7
-rw-r--r--gnuefi/elf_ia64_efi.lds7
-rw-r--r--gnuefi/elf_x86_64_efi.lds7
-rw-r--r--gnuefi/elf_x86_64_fbsd_efi.lds7
12 files changed, 147 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index bb18dcd..970b638 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
*.efi
+*.efi.debug
*.o
*.a
*.tar.*
diff --git a/Make.defaults b/Make.defaults
index f9c20f3..e1759f7 100644
--- a/Make.defaults
+++ b/Make.defaults
@@ -140,13 +140,14 @@ INCDIR += -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) \
-I$(TOPDIR)/inc/protocol
ifeq (FreeBSD, $(findstring FreeBSD, $(OS)))
-CFLAGS += $(ARCH3264) -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
+CFLAGS += $(ARCH3264) -g -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
-ffreestanding -fno-stack-protector
else
-CFLAGS += $(ARCH3264) -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
+CFLAGS += $(ARCH3264) -g -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
-fno-merge-constants -ffreestanding -fno-stack-protector \
-fno-stack-check
endif
ASFLAGS += $(ARCH3264)
-LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings
+LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings \
+ --build-id=sha1
diff --git a/Make.rules b/Make.rules
index 80edb3a..5b1c286 100644
--- a/Make.rules
+++ b/Make.rules
@@ -39,6 +39,12 @@
-j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \
-j .reloc $(FORMAT) $*.so $@
+%.efi.debug: %.so
+ $(OBJCOPY) -j .debug_info -j .debug_abbrev -j .debug_aranges \
+ -j .debug_line -j .debug_str -j .debug_ranges \
+ -j .note.gnu.build-id \
+ $(FORMAT) $*.so $@
+
%.so: %.o
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
diff --git a/apps/Makefile b/apps/Makefile
index 1edec9a..cfae62d 100644
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -61,7 +61,7 @@ LOADLIBES += -T $(LDSCRIPT)
TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \
printenv.efi t7.efi t8.efi tcc.efi modelist.efi \
route80h.efi drv0_use.efi AllocPages.efi \
- FreePages.efi setjmp.efi
+ FreePages.efi setjmp.efi debughook.efi debughook.efi.debug
TARGET_BSDRIVERS = drv0.efi
TARGET_RTDRIVERS =
diff --git a/apps/debughook.c b/apps/debughook.c
new file mode 100644
index 0000000..36164d6
--- /dev/null
+++ b/apps/debughook.c
@@ -0,0 +1,92 @@
+#include <efi.h>
+#include <efilib.h>
+
+EFI_STATUS
+GetVariableAttr(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner,
+ UINT32 *attributes)
+{
+ EFI_STATUS efi_status;
+
+ *len = 0;
+
+ efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner,
+ NULL, len, NULL);
+ if (efi_status != EFI_BUFFER_TOO_SMALL)
+ return efi_status;
+
+ *data = AllocateZeroPool(*len);
+ if (!*data)
+ return EFI_OUT_OF_RESOURCES;
+
+ efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner,
+ attributes, len, *data);
+
+ if (efi_status != EFI_SUCCESS) {
+ FreePool(*data);
+ *data = NULL;
+ }
+ return efi_status;
+}
+
+EFI_STATUS
+GetVariable(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner)
+{
+ return GetVariableAttr(var, data, len, owner, NULL);
+}
+
+EFI_GUID DUMMY_GUID =
+{0x55aad538, 0x8f82, 0x4e2a, {0xa4,0xf0,0xbe, 0x59, 0x13, 0xb6, 0x5f, 0x1e}};
+
+static void
+__attribute__((__optimize__("0")))
+DebugHook(void)
+{
+ EFI_GUID guid = DUMMY_GUID;
+ UINT8 *data = NULL;
+ UINTN dataSize = 0;
+ EFI_STATUS efi_status;
+ volatile register UINTN x = 0;
+ extern char _text, _data;
+
+ if (x)
+ return;
+
+ efi_status = GetVariable(L"DUMMY_DEBUG", &data, &dataSize, guid);
+ if (EFI_ERROR(efi_status)) {
+ return;
+ }
+
+ Print(L"add-symbol-file /usr/lib/debug/boot/efi/debughook.debug "
+ L"0x%08x -s .data 0x%08x\n", &_text, &_data);
+
+ Print(L"Pausing for debugger attachment.\n");
+ Print(L"To disable this, remove the EFI variable DUMMY_DEBUG-%g .\n",
+ &guid);
+ x = 1;
+ while (x++) {
+ /* Make this so it can't /totally/ DoS us. */
+#if defined(__x86_64__) || defined(__i386__) || defined(__i686__)
+ if (x > 4294967294)
+ break;
+ __asm__ __volatile__("pause");
+#elif defined(__aarch64__)
+ if (x > 1000)
+ break;
+ __asm__ __volatile__("wfi");
+#else
+ if (x > 12000)
+ break;
+ uefi_call_wrapper(BS->Stall, 1, 5000);
+#endif
+ }
+ x = 1;
+}
+
+
+EFI_STATUS
+efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
+{
+ InitializeLib(image, systab);
+ DebugHook();
+ return EFI_SUCCESS;
+}
diff --git a/gnuefi/elf_aarch64_efi.lds b/gnuefi/elf_aarch64_efi.lds
index 0fdb1f6..6494e59 100644
--- a/gnuefi/elf_aarch64_efi.lds
+++ b/gnuefi/elf_aarch64_efi.lds
@@ -4,6 +4,7 @@ ENTRY(_start)
SECTIONS
{
.text 0x0 : {
+ _text = .;
*(.text.head)
*(.text)
*(.text.*)
@@ -11,11 +12,13 @@ SECTIONS
*(.srodata)
*(.rodata*)
. = ALIGN(16);
- _etext = .;
}
+ _etext = .;
+ _text_size = . - _text;
.dynamic : { *(.dynamic) }
.data :
{
+ _data = .;
*(.sdata)
*(.data)
*(.data1)
diff --git a/gnuefi/elf_arm_efi.lds b/gnuefi/elf_arm_efi.lds
index 1bd6b78..63d31be 100644
--- a/gnuefi/elf_arm_efi.lds
+++ b/gnuefi/elf_arm_efi.lds
@@ -4,6 +4,7 @@ ENTRY(_start)
SECTIONS
{
.text 0x0 : {
+ _text = .;
*(.text.head)
*(.text)
*(.text.*)
@@ -11,11 +12,13 @@ SECTIONS
*(.srodata)
*(.rodata*)
. = ALIGN(16);
- _etext = .;
}
+ _etext = .;
+ _text_size = . - _text;
.dynamic : { *(.dynamic) }
.data :
{
+ _data = .;
*(.sdata)
*(.data)
*(.data1)
diff --git a/gnuefi/elf_ia32_efi.lds b/gnuefi/elf_ia32_efi.lds
index 975e36c..b164094 100644
--- a/gnuefi/elf_ia32_efi.lds
+++ b/gnuefi/elf_ia32_efi.lds
@@ -9,13 +9,18 @@ SECTIONS
. = ALIGN(4096);
.text :
{
+ _text = .;
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
+ . = ALIGN(16);
}
+ _etext = .;
+ _text_size = . - _text;
. = ALIGN(4096);
.sdata :
{
+ _data = .;
*(.got.plt)
*(.got)
*(.srodata)
@@ -55,6 +60,8 @@ SECTIONS
*(.data.rel.ro)
*(.data.rel*)
}
+ _edata = .;
+ _data_size = . - _etext;
. = ALIGN(4096);
.reloc : /* This is the PECOFF .reloc section! */
{
diff --git a/gnuefi/elf_ia32_fbsd_efi.lds b/gnuefi/elf_ia32_fbsd_efi.lds
index bc25b1f..1f56cd7 100644
--- a/gnuefi/elf_ia32_fbsd_efi.lds
+++ b/gnuefi/elf_ia32_fbsd_efi.lds
@@ -9,13 +9,18 @@ SECTIONS
. = ALIGN(4096);
.text :
{
+ _text = .;
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
+ . = ALIGN(16);
}
+ _etext = .;
+ _text_size = . - _text;
. = ALIGN(4096);
.sdata :
{
+ _data = .;
*(.got.plt)
*(.got)
*(.srodata)
@@ -55,6 +60,8 @@ SECTIONS
*(.data.rel.ro)
*(.data.rel*)
}
+ _edata = .;
+ _data_size = . - _etext;
. = ALIGN(4096);
.reloc : /* This is the PECOFF .reloc section! */
{
diff --git a/gnuefi/elf_ia64_efi.lds b/gnuefi/elf_ia64_efi.lds
index 1d9ffc1..a6ec717 100644
--- a/gnuefi/elf_ia64_efi.lds
+++ b/gnuefi/elf_ia64_efi.lds
@@ -9,14 +9,19 @@ SECTIONS
. = ALIGN(4096);
.text :
{
+ _text = .;
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
+ . = ALIGN(16);
}
+ _etext = .;
+ _text_size = . - _text;
. = ALIGN(4096);
__gp = ALIGN (8) + 0x200000;
.sdata :
{
+ _data = .;
*(.got.plt)
*(.got)
*(.srodata)
@@ -51,6 +56,8 @@ SECTIONS
*(.rela.stab)
*(.rela.ctors)
}
+ _edata = .;
+ _data_size = . - _etext;
. = ALIGN(4096);
.reloc : /* This is the PECOFF .reloc section! */
{
diff --git a/gnuefi/elf_x86_64_efi.lds b/gnuefi/elf_x86_64_efi.lds
index c4df0a5..3862d9f 100644
--- a/gnuefi/elf_x86_64_efi.lds
+++ b/gnuefi/elf_x86_64_efi.lds
@@ -15,10 +15,14 @@ SECTIONS
. = ALIGN(4096);
.text :
{
+ _text = .;
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
+ . = ALIGN(16);
}
+ _etext = .;
+ _text_size = . - _text;
. = ALIGN(4096);
.reloc :
{
@@ -27,6 +31,7 @@ SECTIONS
. = ALIGN(4096);
.data :
{
+ _data = .;
*(.rodata*)
*(.got.plt)
*(.got)
@@ -41,6 +46,8 @@ SECTIONS
*(COMMON)
*(.rel.local)
}
+ _edata = .;
+ _data_size = . - _etext;
. = ALIGN(4096);
.dynamic : { *(.dynamic) }
. = ALIGN(4096);
diff --git a/gnuefi/elf_x86_64_fbsd_efi.lds b/gnuefi/elf_x86_64_fbsd_efi.lds
index 2c64609..507fe43 100644
--- a/gnuefi/elf_x86_64_fbsd_efi.lds
+++ b/gnuefi/elf_x86_64_fbsd_efi.lds
@@ -15,8 +15,12 @@ SECTIONS
. = ALIGN(4096);
.text :
{
+ _text = .;
*(.text)
+ . = ALIGN(16);
}
+ _etext = .;
+ _text_size = . - _text;
.reloc :
{
*(.reloc)
@@ -24,6 +28,7 @@ SECTIONS
. = ALIGN(4096);
.data :
{
+ _data = .;
*(.rodata*)
*(.got.plt)
*(.got)
@@ -47,6 +52,8 @@ SECTIONS
*(.rela.got)
*(.rela.stab)
}
+ _edata = .;
+ _data_size = . - _etext;
. = ALIGN(4096);
.dynsym : { *(.dynsym) }
. = ALIGN(4096);