On Mon, May 15, 2017 at 7:24 AM, REIX, Tony <tony.r...@atos.net> wrote: > Description: > * This patch enables libbacktrace to handle XCOFF on AIX. > > Tests: > * Fedora25/x86_64 + GCC v7.1.0 : Configure/Build: SUCCESS > - build made by means of a .spec file based on Fedora gcc-7.0.1-0.12 .spec > file > ../configure --enable-bootstrap > --enable-languages=c,c++,objc,obj-c++,fortran,go,lto --prefix=/usr > --mandir=/usr/share/man --infodir=/usr/share/info > --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared > --enable-threads=posix --enable-checking=release --enable-multilib > --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions > --enable-gnu-unique-object --enable-linker-build-id > --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin > --enable-initfini-array --with-isl --enable-libmpx > --enable-offload-targets=nvptx-none --without-cuda-driver > --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 > --build=x86_64-redhat-linux > > ChangeLog: > * libbacktrace/Makefile.am : Add xcoff.c > * libbacktrace/Makefile.in : Regenerated > * libbacktrace/configure.ac : Add XCOFF output file type > * libbacktrace/configure : Regenerated > * libbacktrace/fileline.c : Handle AIX procfs tree > * libbacktrace/filetype.awk : Add AIX XCOFF type detection > * libbacktrace/xcoff.c : New file for handling XCOFF format
Thanks. Committed with some minor changes, as follows. Ian 2017-07-21 Tony Reix <tony.r...@atos.net> * filetype.awk: Add AIX XCOFF type detection. * configure.ac: Recognize xcoff format. * Makefile.am (FORMAT_FILES): Add xcoff.c. * fileline.c: Include <unistd.h>. (fileline_initialize): Add case for AIX procfs. * xcoff.c: New file. * configure, Makefile.in: Rebuild.
Index: Makefile.am =================================================================== --- Makefile.am (revision 250406) +++ Makefile.am (working copy) @@ -57,7 +57,8 @@ BACKTRACE_FILES = \ FORMAT_FILES = \ elf.c \ pecoff.c \ - unknown.c + unknown.c \ + xcoff.c VIEW_FILES = \ read.c \ @@ -155,3 +156,5 @@ sort.lo: config.h backtrace.h internal.h stest.lo: config.h backtrace.h internal.h state.lo: config.h backtrace.h backtrace-supported.h internal.h unknown.lo: config.h backtrace.h internal.h +xcoff.lo: config.h backtrace.h internal.h + Index: configure.ac =================================================================== --- configure.ac (revision 250406) +++ configure.ac (working copy) @@ -233,6 +233,9 @@ elf*) FORMAT_FILE="elf.lo" ;; pecoff) FORMAT_FILE="pecoff.lo" backtrace_supports_data=no ;; +xcoff) FORMAT_FILE="xcoff.lo" + backtrace_supports_data=no + ;; *) AC_MSG_WARN([could not determine output file type]) FORMAT_FILE="unknown.lo" backtrace_supported=no Index: fileline.c =================================================================== --- fileline.c (revision 250406) +++ fileline.c (working copy) @@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> #include <fcntl.h> #include <stdlib.h> +#include <unistd.h> #include "backtrace.h" #include "internal.h" @@ -57,6 +58,7 @@ fileline_initialize (struct backtrace_st int pass; int called_error_callback; int descriptor; + char buf[64]; if (!state->threaded) failed = state->fileline_initialization_failed; @@ -80,7 +82,7 @@ fileline_initialize (struct backtrace_st descriptor = -1; called_error_callback = 0; - for (pass = 0; pass < 4; ++pass) + for (pass = 0; pass < 5; ++pass) { const char *filename; int does_not_exist; @@ -99,6 +101,10 @@ fileline_initialize (struct backtrace_st case 3: filename = "/proc/curproc/file"; break; + case 4: + snprintf (buf, sizeof (buf), "/proc/%d/object/a.out", getpid ()); + filename = buf; + break; default: abort (); } Index: filetype.awk =================================================================== --- filetype.awk (revision 250406) +++ filetype.awk (working copy) @@ -3,3 +3,6 @@ /\177ELF\002/ { if (NR == 1) { print "elf64"; exit } } /\114\001/ { if (NR == 1) { print "pecoff"; exit } } /\144\206/ { if (NR == 1) { print "pecoff"; exit } } +/\001\337/ { if (NR == 1) { print "xcoff"; exit } } +/\001\367/ { if (NR == 1) { print "xcoff"; exit } } + Index: xcoff.c =================================================================== --- xcoff.c (revision 0) +++ xcoff.c (working copy) @@ -0,0 +1,76 @@ +/* xcoff.c -- Get debug data from a XCOFFF file for backtraces. + Copyright (C) 2017 Free Software Foundation, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + (1) Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + (2) Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + (3) The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. */ + +#include "config.h" + +#include <sys/types.h> + +#include "backtrace.h" +#include "internal.h" + +/* A trivial routine that always fails to find fileline data. */ + +static int +xcoff_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED, + uintptr_t pc, backtrace_full_callback callback, + backtrace_error_callback error_callback ATTRIBUTE_UNUSED, + void *data) + +{ + static char buf[32]; + + snprintf (buf, sizeof(buf), "pc=0x%llx", (unsigned long long) pc); + return callback (data, pc, "unknown_file", 123, buf); +} + +static void +xcoff_syminfo (struct backtrace_state *state ATTRIBUTE_UNUSED, uintptr_t addr, + backtrace_syminfo_callback callback, + backtrace_error_callback error_callback ATTRIBUTE_UNUSED, + void *data) +{ + callback (data, addr, "unknown", 0, 0); +} + +/* Initialize the backtrace data when we don't know how to read the + debug info. */ + +int +backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED, + int descriptor ATTRIBUTE_UNUSED, + backtrace_error_callback error_callback ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED, fileline *fileline_fn) +{ + state->syminfo_fn = xcoff_syminfo; + state->fileline_data = NULL; + *fileline_fn = xcoff_fileline; + return 1; +}