Skip to content

Commit

Permalink
Merge branch 'elf-move'
Browse files Browse the repository at this point in the history
Conflicts:
	debug/backtracesymsfd.c
	sysdeps/generic/elf/backtracesymsfd.c
	sysdeps/i386/configure.in
  • Loading branch information
Andreas Jaeger committed Mar 27, 2012
2 parents c876e00 + d6373f9 commit 1e3cdfd
Show file tree
Hide file tree
Showing 21 changed files with 836 additions and 882 deletions.
117 changes: 117 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,120 @@
2012-03-27 David S. Miller <davem@davemloft.net>

* sysdeps/sparc/sparc64/Makefile (ASFLAGS-.os): Move before
have-as-vis3 check.

2012-03-27 Andreas Jaeger <aj@suse.de>

* sysdeps/x86_64/elf/configure.in: Moved to ...
* sysdeps/x86_64/configure.in: ... here.
* sysdeps/x86_64/elf/start.S: Moved to ...
* sysdeps/x86_64/start.S: ... here.
* sysdeps/x86_64/elf/configure: Delete.

* sysdeps/x86_64/configure.in: Merge contents from
sysdeps/i386/configure.in (without i686 check).

* sysdeps/i386/elf/Versions: Merge into ...
* sysdeps/i386/Versions: ... this.
* sysdeps/i386/elf/Versions: Delete file.
* sysdeps/i386/elf/start.S: Moved to ...
* sysdeps/i386/start.S: ...here.
* sysdeps/i386/elf/configure.in: Merge into...
* sysdeps/i386/configure.in: ...here.
* sysdeps/i386/elf/configure.in: Delete file.
* sysdeps/i386/elf/configure: Delete file.

* sysdeps/generic/elf/backtracesyms.c: Moved to ...
* debug/backtracesyms.c: ... here.
* sysdeps/generic/elf/backtracesymsfd.c: Moved to ...
* debug/backtracesymsfd.c: ... here.
* sysdeps/generic/elf/ifunc-sel.h: Moved to ...
* sysdeps/generic/ifunc-sel.h: ... here.

* sysdeps/unix/i386/start.c: Delete file.
* sysdeps/unix/sparc/start.c: Delete file.
* sysdeps/unix/start.c: Delete file.

* sysdeps/sh/elf/configure.in: Moved to ...
* sysdeps/sh/configure.in: ... here.
* sysdeps/sh/elf/start.S: Moved to ...
* sysdeps/sh/start.S: ... here.
* sysdeps/sh/elf/configure: Delete file.

* sysdeps/powerpc/powerpc64/elf/bzero.S: Moved to ...
* sysdeps/powerpc/powerpc64/bzero.S: ... here.
* sysdeps/powerpc/powerpc64/elf/entry.h: Moved to ...
* sysdeps/powerpc/powerpc64/entry.h: ... here.
* sysdeps/powerpc/powerpc64/elf/start.S: Moved to ...
* sysdeps/powerpc/powerpc64/start.S: here.
* sysdeps/powerpc/powerpc64/elf/Makefile: Merge into ...
* sysdeps/powerpc/powerpc64/Makefile: ... this.
* sysdeps/powerpc/powerpc64/elf/configure.in: Merge into ...
* sysdeps/powerpc/powerpc64/configure.in: ... this.
* sysdeps/powerpc/powerpc64/elf/configure: Delete file.

* sysdeps/powerpc/powerpc32/elf/bzero.S: Moved to ...
* sysdeps/powerpc/powerpc32/bzero.S: ... here.
* sysdeps/powerpc/powerpc32/elf/start.S: Moved to ...
* sysdeps/powerpc/powerpc32/start.S: ... here.
* sysdeps/powerpc/powerpc32/elf/configure.in: Merge into ...
* sysdeps/powerpc/powerpc32/configure.in: ... this.
* sysdeps/powerpc/powerpc32/elf/configure: Delete file.

* sysdeps/powerpc/elf/ifunc-sel.h: Moved to ...
* sysdeps/powerpc/ifunc-sel.h: ... here.
* sysdeps/powerpc/elf/rtld-global-offsets.sym: Moved to ...
* sysdeps/powerpc/rtld-global-offsets.sym: ... here.

* sysdeps/sparc/elf/configure.in: Moved to ...
* sysdeps/sparc/configure.in: ... here.
* sysdeps/sparc/elf/configure: Delete file.
* sysdeps/sparc/sparc32/elf/start.S: Moved to ...
* sysdeps/sparc/sparc32/start.S: ... here.
* sysdeps/sparc/sparc64/elf/start.S: Moved to ...
* sysdeps/sparc/sparc64/start.S: ... here.
* sysdeps/sparc/sparc32/elf/Makefile: Merged into ...
* sysdeps/sparc/sparc32/Makefile: ... this.
* sysdeps/sparc/sparc64/elf/Makefile: Merged into ...
* sysdeps/sparc/sparc64/Makefile: ... this.

* sysdeps/s390/s390-32/elf/bsd-_setjmp.S: Moved to ...
* sysdeps/s390/s390-32/bsd-_setjmp.S: ... here.
* sysdeps/s390/s390-32/elf/bsd-setjmp.S: Moved to ...
* sysdeps/s390/s390-32/bsd-setjmp.S: ... here.
* sysdeps/s390/s390-32/elf/setjmp.S: Moved to ...
* sysdeps/s390/s390-32/setjmp.S: ... here.
* sysdeps/s390/s390-32/elf/configure.in: Moved to ...
* sysdeps/s390/s390-32/configure.in: ... here.
* sysdeps/s390/s390-32/elf/configure: Delete file.
* sysdeps/s390/s390-32/elf/start.S: Moved to ...
* sysdeps/s390/s390-32/start.S: ... here.

* sysdeps/s390/s390-64/elf/bsd-_setjmp.S: Moved to ...
* sysdeps/s390/s390-64/bsd-_setjmp.S: ... here.
* sysdeps/s390/s390-64/elf/bsd-setjmp.S: Moved to ...
* sysdeps/s390/s390-64/bsd-setjmp.S: ... here.
* sysdeps/s390/s390-64/elf/setjmp.S: Moved to ...
* sysdeps/s390/s390-64/setjmp.S: ... here.
* sysdeps/s390/s390-64/elf/configure.in: Moved to ...
* sysdeps/s390/s390-64/configure.in: ... here
* sysdeps/s390/s390-64/elf/configure: Delete file.
* sysdeps/s390/s390-64/elf/start.S: Moved to ...
* sysdeps/s390/s390-64/start.S: ... here.
* sysdeps/s390/s390-64/elf/configure: Delete.

* configure.in: Remove support for elf directories in sysdeps.

* configure: Regenerated.
* sysdeps/i386/configure: Regenerated.
* sysdeps/powerpc/powerpc32/configure: Regenerated.
* sysdeps/powerpc/powerpc64/configure: Regenerated.
* sysdeps/s390/s390-32/configure: Regenerated.
* sysdeps/s390/s390-64/configure: Regenerated.
* sysdeps/sh/configure: Regenerated.
* sysdeps/sparc/configure: Regenerated.
* sysdeps/x86_64/configure: Regenerated.

2012-03-26 Andreas Schwab <schwab@linux-m68k.org>

* sysdeps/powerpc/fpu/libm-test-ulps: Update.
Expand Down
81 changes: 73 additions & 8 deletions debug/backtracesyms.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Return list with names for address in backtrace.
Copyright (C) 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand All @@ -17,39 +17,104 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#include <assert.h>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <ldsodefs.h>

/* Assume the worst for the width of an address. */
#define WORD_WIDTH 16
#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
#else
/* We assyme 64bits. */
# define WORD_WIDTH 16
#endif


char **
__backtrace_symbols (array, size)
void *const *array;
int size;
{
Dl_info info[size];
int status[size];
int cnt;
size_t total = 0;
char **result;

/* We can compute the text size needed for the symbols since we print
them all as "[+0x<addr>]". */
total = size * (WORD_WIDTH + 6);
/* Fill in the information we can get from `dladdr'. */
for (cnt = 0; cnt < size; ++cnt)
{
struct link_map *map;
status[cnt] = _dl_addr (array[cnt], &info[cnt], &map, NULL);
if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
{
/* We have some info, compute the length of the string which will be
"<file-name>(<sym-name>+offset) [address]. */
total += (strlen (info[cnt].dli_fname ?: "")
+ strlen (info[cnt].dli_sname ?: "")
+ 3 + WORD_WIDTH + 3 + WORD_WIDTH + 5);

/* The load bias is more useful to the user than the load
address. The use of these addresses is to calculate an
address in the ELF file, so its prelinked bias is not
something we want to subtract out. */
info[cnt].dli_fbase = (void *) map->l_addr;
}
else
total += 5 + WORD_WIDTH;
}

/* Allocate memory for the result. */
result = malloc (size * sizeof (char *) + total);
result = (char **) malloc (size * sizeof (char *) + total);
if (result != NULL)
{
char *last = (char *) (result + size);

for (cnt = 0; cnt < size; ++cnt)
{
result[cnt] = last;
last += 1 + sprintf (last, "[+%p]", array[cnt]);

if (status[cnt]
&& info[cnt].dli_fname != NULL && info[cnt].dli_fname[0] != '\0')
{
if (info[cnt].dli_sname == NULL)
/* We found no symbol name to use, so describe it as
relative to the file. */
info[cnt].dli_saddr = info[cnt].dli_fbase;

if (info[cnt].dli_sname == NULL && info[cnt].dli_saddr == 0)
last += 1 + sprintf (last, "%s(%s) [%p]",
info[cnt].dli_fname ?: "",
info[cnt].dli_sname ?: "",
array[cnt]);
else
{
char sign;
ptrdiff_t offset;
if (array[cnt] >= (void *) info[cnt].dli_saddr)
{
sign = '+';
offset = array[cnt] - info[cnt].dli_saddr;
}
else
{
sign = '-';
offset = info[cnt].dli_saddr - array[cnt];
}

last += 1 + sprintf (last, "%s(%s%c%#tx) [%p]",
info[cnt].dli_fname ?: "",
info[cnt].dli_sname ?: "",
sign, offset, array[cnt]);
}
}
else
last += 1 + sprintf (last, "[%p]", array[cnt]);
}
assert (last <= (char *) result + size * sizeof (char *) + total);
}

return result;
Expand Down
86 changes: 74 additions & 12 deletions debug/backtracesymsfd.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Write formatted list with names for addresses in backtrace to a file.
Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand All @@ -22,7 +22,7 @@
#include <sys/uio.h>

#include <_itoa.h>
#include <not-cancel.h>
#include <ldsodefs.h>

#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
Expand All @@ -38,25 +38,87 @@ __backtrace_symbols_fd (array, size, fd)
int size;
int fd;
{
struct iovec iov[3];
struct iovec iov[9];
int cnt;

for (cnt = 0; cnt < size; ++cnt)
{
char buf[WORD_WIDTH];
char buf2[WORD_WIDTH];
Dl_info info;
struct link_map *map;
size_t last = 0;

iov[0].iov_base = (void *) "[0x";
iov[0].iov_len = 3;
if (_dl_addr (array[cnt], &info, &map, NULL)
&& info.dli_fname != NULL && info.dli_fname[0] != '\0')
{
/* Name of the file. */
iov[0].iov_base = (void *) info.dli_fname;
iov[0].iov_len = strlen (info.dli_fname);
last = 1;

iov[1].iov_base = _itoa_word ((unsigned long int) array[cnt],
&buf[WORD_WIDTH], 16, 0);
iov[1].iov_len = &buf[WORD_WIDTH] - (char *) iov[1].iov_base;
if (info.dli_sname != NULL || map->l_addr != 0)
{
size_t diff;

iov[2].iov_base = (void *) "]\n";
iov[2].iov_len = 2;
iov[last].iov_base = (void *) "(";
iov[last].iov_len = 1;
++last;

/* We prefer to use the non-cancelable interface if it is available. */
writev_not_cancel_no_status (fd, iov, 3);
if (info.dli_sname != NULL)
{
/* We have a symbol name. */
iov[last].iov_base = (void *) info.dli_sname;
iov[last].iov_len = strlen (info.dli_sname);
++last;
}
else
/* We have no symbol, so describe it as relative to the file.
The load bias is more useful to the user than the load
address. The use of these addresses is to calculate an
address in the ELF file, so its prelinked bias is not
something we want to subtract out. */
info.dli_saddr = (void *) map->l_addr;

if (array[cnt] >= (void *) info.dli_saddr)
{
iov[last].iov_base = (void *) "+0x";
diff = array[cnt] - info.dli_saddr;
}
else
{
iov[last].iov_base = (void *) "-0x";
diff = info.dli_saddr - array[cnt];
}
iov[last].iov_len = 3;
++last;

iov[last].iov_base = _itoa_word ((unsigned long int) diff,
&buf2[WORD_WIDTH], 16, 0);
iov[last].iov_len = (&buf2[WORD_WIDTH]
- (char *) iov[last].iov_base);
++last;

iov[last].iov_base = (void *) ")";
iov[last].iov_len = 1;
++last;
}
}

iov[last].iov_base = (void *) "[0x";
iov[last].iov_len = 3;
++last;

iov[last].iov_base = _itoa_word ((unsigned long int) array[cnt],
&buf[WORD_WIDTH], 16, 0);
iov[last].iov_len = &buf[WORD_WIDTH] - (char *) iov[last].iov_base;
++last;

iov[last].iov_base = (void *) "]\n";
iov[last].iov_len = 2;
++last;

__writev (fd, iov, last);
}
}
weak_alias (__backtrace_symbols_fd, backtrace_symbols_fd)
Expand Down
Loading

0 comments on commit 1e3cdfd

Please sign in to comment.