diff options
author | Aleksandar Ristovski <aristovski@qnx.com> | 2015-10-21 10:37:33 -0400 |
---|---|---|
committer | Aleksandar Ristovski <aristovski@qnx.com> | 2015-10-21 10:37:33 -0400 |
commit | d7161de46af80e460d432d8dbb1c42f8cbacf6dc (patch) | |
tree | 23b14a9132d8fe30ddde69eb2ad76f84dbb272cd /gdb | |
parent | a9889169e5b21efb8c42105fc62461be43968d64 (diff) | |
download | gdb-d7161de46af80e460d432d8dbb1c42f8cbacf6dc.zip gdb-d7161de46af80e460d432d8dbb1c42f8cbacf6dc.tar.gz gdb-d7161de46af80e460d432d8dbb1c42f8cbacf6dc.tar.bz2 |
[nto] Improve ABI sniffing.
Use qnx specific notes to figure out the OS.
gdb/ChangeLog:
* gdb/nto-tdep.c (QNX_NOTE_NAME, QNX_INFO_SECT_NAME): New defines.
(nto_sniff_abi_note_section): New function.
(nto_elf_osabi_sniffer): Use new function to recognize nto specific
binary.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/nto-tdep.c | 48 |
2 files changed, 52 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 277a0ce..8233d67 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2015-10-21 Aleksandar Ristovski <aristovski@qnx.com> + * gdb/nto-tdep.c (QNX_NOTE_NAME, QNX_INFO_SECT_NAME): New defines. + (nto_sniff_abi_note_section): New function. + (nto_elf_osabi_sniffer): Use new function to recognize nto specific + binary. + +2015-10-21 Aleksandar Ristovski <aristovski@qnx.com> + * nto-procfs.c (procfs_wait): Set stopped_flags nad stopped_pc. (procfs_stopped_by_watchpoint): Use flags stored in inferior data. * nto-tdep.c (nto_new_inferior_data_reg): New definition. diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c index e50d302..fdf6c81 100644 --- a/gdb/nto-tdep.c +++ b/gdb/nto-tdep.c @@ -32,6 +32,9 @@ #include "gdbcore.h" #include "objfiles.h" +#define QNX_NOTE_NAME "QNX" +#define QNX_INFO_SECT_NAME "QNX_info" + #ifdef __CYGWIN__ #include <sys/cygwin.h> #endif @@ -332,12 +335,51 @@ nto_dummy_supply_regset (struct regcache *regcache, char *regs) /* Do nothing. */ } +static void +nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj) +{ + const char *sectname; + unsigned int sectsize; + /* Buffer holding the section contents. */ + char *note; + unsigned int namelen; + const char *name; + const unsigned sizeof_Elf_Nhdr = 12; + + sectname = bfd_get_section_name (abfd, sect); + sectsize = bfd_section_size (abfd, sect); + + if (sectsize > 128) + sectsize = 128; + + if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL) + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; + else if (sectname != NULL && strstr (sectname, "note") != NULL + && sectsize > sizeof_Elf_Nhdr) + { + note = XNEWVEC (char, sectsize); + bfd_get_section_contents (abfd, sect, note, 0, sectsize); + namelen = (unsigned int) bfd_h_get_32 (abfd, note); + name = note + sizeof_Elf_Nhdr; + if (sectsize >= namelen + sizeof_Elf_Nhdr + && namelen == sizeof (QNX_NOTE_NAME) + && 0 == strcmp (name, QNX_NOTE_NAME)) + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; + + XDELETEVEC (note); + } +} + enum gdb_osabi nto_elf_osabi_sniffer (bfd *abfd) { - if (nto_is_nto_target) - return nto_is_nto_target (abfd); - return GDB_OSABI_UNKNOWN; + enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; + + bfd_map_over_sections (abfd, + nto_sniff_abi_note_section, + &osabi); + + return osabi; } static const char *nto_thread_state_str[] = |