X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fauxv.c;h=7b4ecbe2bc8fdef4061fc8c18c52b8ffba1baaf9;hb=e17a4113357102b55cfa5b80557d590a46a43300;hp=1bc6721cbc2766cb14bb3386ef45d3530286f686;hpb=a9762ec78a53fbe9209fe1654db42df0cd328d50;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/auxv.c b/gdb/auxv.c index 1bc6721cbc..7b4ecbe2bc 100644 --- a/gdb/auxv.c +++ b/gdb/auxv.c @@ -1,6 +1,7 @@ /* Auxiliary vector support for GDB, the GNU debugger. - Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 + Free Software Foundation, Inc. This file is part of GDB. @@ -32,16 +33,13 @@ #include -/* This function is called like a to_xfer_partial hook, - but must be called with TARGET_OBJECT_AUXV. - It handles access via /proc/PID/auxv, which is the common method. - This function is appropriate for doing: - #define NATIVE_XFER_AUXV procfs_xfer_auxv - for a native target that uses inftarg.c's child_xfer_partial hook. */ +/* This function is called like a to_xfer_partial hook, but must be + called with TARGET_OBJECT_AUXV. It handles access via + /proc/PID/auxv, which is a common method for native targets. */ LONGEST procfs_xfer_auxv (struct target_ops *ops, - int /* enum target_object */ object, + enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, @@ -78,11 +76,13 @@ procfs_xfer_auxv (struct target_ops *ops, Return 0 if *READPTR is already at the end of the buffer. Return -1 if there is insufficient buffer for a whole entry. Return 1 if an entry was read into *TYPEP and *VALP. */ -int -target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, +static int +default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { - const int sizeof_auxv_field = TYPE_LENGTH (builtin_type_void_data_ptr); + const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch) + / TARGET_CHAR_BIT; + const enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); gdb_byte *ptr = *readptr; if (endptr == ptr) @@ -91,15 +91,31 @@ target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, if (endptr - ptr < sizeof_auxv_field * 2) return -1; - *typep = extract_unsigned_integer (ptr, sizeof_auxv_field); + *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order); ptr += sizeof_auxv_field; - *valp = extract_unsigned_integer (ptr, sizeof_auxv_field); + *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order); ptr += sizeof_auxv_field; *readptr = ptr; return 1; } +/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR. + Return 0 if *READPTR is already at the end of the buffer. + Return -1 if there is insufficient buffer for a whole entry. + Return 1 if an entry was read into *TYPEP and *VALP. */ +int +target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) +{ + struct target_ops *t; + for (t = ops; t != NULL; t = t->beneath) + if (t->to_auxv_parse != NULL) + return t->to_auxv_parse (t, readptr, endptr, typep, valp); + + return default_auxv_parse (ops, readptr, endptr, typep, valp); +} + /* Extract the auxiliary vector entry with a_type matching MATCH. Return zero if no such entry was found, or -1 if there was an error getting the information. On success, return 1 after @@ -155,7 +171,6 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) while (target_auxv_parse (ops, &ptr, data + len, &type, &val) > 0) { - extern int addressprint; const char *name = "???"; const char *description = ""; enum { dec, hex, str } flavor = hex; @@ -187,9 +202,12 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) TAG (AT_ICACHEBSIZE, _("Instruction cache block size"), dec); TAG (AT_UCACHEBSIZE, _("Unified cache block size"), dec); TAG (AT_IGNOREPPC, _("Entry should be ignored"), dec); + TAG (AT_BASE_PLATFORM, _("String identifying base platform"), str); + TAG (AT_RANDOM, _("Address of 16 random bytes"), hex); + TAG (AT_EXECFN, _("File name of executable"), str); + TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), dec); TAG (AT_SYSINFO, _("Special system info/entry points"), hex); TAG (AT_SYSINFO_EHDR, _("System-supplied DSO's ELF header"), hex); - TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), dec); TAG (AT_SUN_UID, _("Effective user ID"), dec); TAG (AT_SUN_RUID, _("Real user ID"), dec); TAG (AT_SUN_GID, _("Effective group ID"), dec); @@ -208,26 +226,35 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) _("Canonicalized file name given to execve"), str); TAG (AT_SUN_MMU, _("String for name of MMU module"), str); TAG (AT_SUN_LDDATA, _("Dynamic linker's data segment address"), hex); + TAG (AT_SUN_AUXFLAGS, + _("AF_SUN_ flags passed from the kernel"), hex); } fprintf_filtered (file, "%-4s %-20s %-30s ", - paddr_d (type), name, description); + plongest (type), name, description); switch (flavor) { case dec: - fprintf_filtered (file, "%s\n", paddr_d (val)); + fprintf_filtered (file, "%s\n", plongest (val)); break; case hex: - fprintf_filtered (file, "0x%s\n", paddr_nz (val)); + fprintf_filtered (file, "%s\n", paddress (target_gdbarch, val)); break; case str: - if (addressprint) - fprintf_filtered (file, "0x%s", paddr_nz (val)); - val_print_string (val, -1, 1, file); - fprintf_filtered (file, "\n"); + { + struct value_print_options opts; + get_user_print_options (&opts); + if (opts.addressprint) + fprintf_filtered (file, "%s", paddress (target_gdbarch, val)); + val_print_string (builtin_type (target_gdbarch)->builtin_char, + val, -1, file, &opts); + fprintf_filtered (file, "\n"); + } break; } ++ents; + if (type == AT_NULL) + break; } xfree (data);