mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 22:30:07 +00:00
Merge branch 'elf-move'
Conflicts: debug/backtracesymsfd.c sysdeps/generic/elf/backtracesymsfd.c sysdeps/i386/configure.in
This commit is contained in:
commit
1e3cdfda74
117
ChangeLog
117
ChangeLog
@ -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.
|
||||
|
@ -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.
|
||||
|
||||
@ -17,13 +17,20 @@
|
||||
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 **
|
||||
@ -31,16 +38,37 @@ __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);
|
||||
@ -48,8 +76,45 @@ __backtrace_symbols (array, 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;
|
||||
|
@ -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.
|
||||
|
||||
@ -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
|
||||
@ -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)
|
||||
|
@ -1,122 +0,0 @@
|
||||
/* Return list with names for address in backtrace.
|
||||
Copyright (C) 1998,1999,2000,2001,2003,2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
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>
|
||||
|
||||
#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;
|
||||
|
||||
/* 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 = (char **) malloc (size * sizeof (char *) + total);
|
||||
if (result != NULL)
|
||||
{
|
||||
char *last = (char *) (result + size);
|
||||
|
||||
for (cnt = 0; cnt < size; ++cnt)
|
||||
{
|
||||
result[cnt] = last;
|
||||
|
||||
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;
|
||||
}
|
||||
weak_alias (__backtrace_symbols, backtrace_symbols)
|
@ -1,125 +0,0 @@
|
||||
/* Write formatted list with names for addresses in backtrace to a file.
|
||||
Copyright (C) 1998,2000,2003,2005,2009,2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <string.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <_itoa.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
#if __ELF_NATIVE_CLASS == 32
|
||||
# define WORD_WIDTH 8
|
||||
#else
|
||||
/* We assume 64bits. */
|
||||
# define WORD_WIDTH 16
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
__backtrace_symbols_fd (array, size, fd)
|
||||
void *const *array;
|
||||
int size;
|
||||
int fd;
|
||||
{
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
if (info.dli_sname != NULL || map->l_addr != 0)
|
||||
{
|
||||
size_t diff;
|
||||
|
||||
iov[last].iov_base = (void *) "(";
|
||||
iov[last].iov_len = 1;
|
||||
++last;
|
||||
|
||||
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)
|
||||
libc_hidden_def (__backtrace_symbols_fd)
|
@ -1,3 +1,9 @@
|
||||
ld {
|
||||
GLIBC_2.3 {
|
||||
# The alternative i386 runtime interface to TLS.
|
||||
___tls_get_addr;
|
||||
}
|
||||
}
|
||||
libc {
|
||||
GLIBC_2.0 {
|
||||
# Functions from libgcc.
|
||||
|
44
sysdeps/i386/configure
vendored
44
sysdeps/i386/configure
vendored
@ -348,3 +348,47 @@ fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_novzeroupper" >&5
|
||||
$as_echo "$libc_cv_cc_novzeroupper" >&6; }
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and
|
||||
# linker.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for i386 TLS support" >&5
|
||||
$as_echo_n "checking for i386 TLS support... " >&6; }
|
||||
if ${libc_cv_386_tls+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .long 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 4
|
||||
.text
|
||||
baz: leal bar@TLSLDM(%ebx), %eax
|
||||
leal bar@DTPOFF(%eax), %edx
|
||||
subl foo@GOTTPOFF(%edx), %eax
|
||||
subl $bar@TPOFF, %eax
|
||||
movl foo@GOTNTPOFF(%edx), %ecx
|
||||
movl %gs:(%ecx), %eax
|
||||
movl %gs:bar@NTPOFF, %eax
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_386_tls=yes
|
||||
else
|
||||
libc_cv_386_tls=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_386_tls" >&5
|
||||
$as_echo "$libc_cv_386_tls" >&6; }
|
||||
if test $libc_cv_386_tls = no; then
|
||||
as_fn_error $? "the assembler must support TLS" "$LINENO" 5
|
||||
fi
|
||||
|
||||
$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
|
||||
|
||||
|
@ -85,3 +85,37 @@ LIBC_TRY_CC_OPTION([-mno-vzeroupper],
|
||||
[libc_cv_cc_novzeroupper=yes],
|
||||
[libc_cv_cc_novzeroupper=no])
|
||||
])
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and
|
||||
# linker.
|
||||
AC_CACHE_CHECK(for i386 TLS support, libc_cv_386_tls, [dnl
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .long 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 4
|
||||
.text
|
||||
baz: leal bar@TLSLDM(%ebx), %eax
|
||||
leal bar@DTPOFF(%eax), %edx
|
||||
subl foo@GOTTPOFF(%edx), %eax
|
||||
subl $bar@TPOFF, %eax
|
||||
movl foo@GOTNTPOFF(%edx), %ecx
|
||||
movl %gs:(%ecx), %eax
|
||||
movl %gs:bar@NTPOFF, %eax
|
||||
EOF
|
||||
dnl
|
||||
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
||||
libc_cv_386_tls=yes
|
||||
else
|
||||
libc_cv_386_tls=no
|
||||
fi
|
||||
rm -f conftest*])
|
||||
if test $libc_cv_386_tls = no; then
|
||||
AC_MSG_ERROR([the assembler must support TLS])
|
||||
fi
|
||||
|
||||
dnl It is always possible to access static and hidden symbols in an
|
||||
dnl position independent way.
|
||||
AC_DEFINE(PI_STATIC_AND_HIDDEN)
|
||||
|
@ -1,6 +0,0 @@
|
||||
ld {
|
||||
GLIBC_2.3 {
|
||||
# The alternative i386 runtime interface to TLS.
|
||||
___tls_get_addr;
|
||||
}
|
||||
}
|
128
sysdeps/i386/elf/configure
vendored
128
sysdeps/i386/elf/configure
vendored
@ -1,128 +0,0 @@
|
||||
|
||||
# as_fn_set_status STATUS
|
||||
# -----------------------
|
||||
# Set $? to STATUS, without forking.
|
||||
as_fn_set_status ()
|
||||
{
|
||||
return $1
|
||||
} # as_fn_set_status
|
||||
|
||||
# as_fn_exit STATUS
|
||||
# -----------------
|
||||
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
|
||||
as_fn_exit ()
|
||||
{
|
||||
set +e
|
||||
as_fn_set_status $1
|
||||
exit $1
|
||||
} # as_fn_exit
|
||||
if expr a : '\(a\)' >/dev/null 2>&1 &&
|
||||
test "X`expr 00001 : '.*\(...\)'`" = X001; then
|
||||
as_expr=expr
|
||||
else
|
||||
as_expr=false
|
||||
fi
|
||||
|
||||
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
|
||||
as_basename=basename
|
||||
else
|
||||
as_basename=false
|
||||
fi
|
||||
|
||||
as_me=`$as_basename -- "$0" ||
|
||||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
|
||||
X"$0" : 'X\(//\)$' \| \
|
||||
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X/"$0" |
|
||||
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
|
||||
|
||||
as_lineno_1=$LINENO as_lineno_1a=$LINENO
|
||||
as_lineno_2=$LINENO as_lineno_2a=$LINENO
|
||||
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
|
||||
test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
|
||||
# Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
|
||||
sed -n '
|
||||
p
|
||||
/[$]LINENO/=
|
||||
' <$as_myself |
|
||||
sed '
|
||||
s/[$]LINENO.*/&-/
|
||||
t lineno
|
||||
b
|
||||
:lineno
|
||||
N
|
||||
:loop
|
||||
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
|
||||
t loop
|
||||
s/-\n.*//
|
||||
' >$as_me.lineno &&
|
||||
chmod +x "$as_me.lineno" ||
|
||||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
|
||||
|
||||
# Don't try to exec as it changes $[0], causing all sort of problems
|
||||
# (the dirname of $[0] is not the place where we might find the
|
||||
# original and so on. Autoconf is especially sensitive to this).
|
||||
. "./$as_me.lineno"
|
||||
# Exit status is that of the last command.
|
||||
exit
|
||||
}
|
||||
|
||||
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
|
||||
# Local configure fragment for sysdeps/i386/elf.
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and
|
||||
# linker.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for i386 TLS support" >&5
|
||||
$as_echo_n "checking for i386 TLS support... " >&6; }
|
||||
if ${libc_cv_386_tls+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .long 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 4
|
||||
.text
|
||||
baz: leal bar@TLSLDM(%ebx), %eax
|
||||
leal bar@DTPOFF(%eax), %edx
|
||||
subl foo@GOTTPOFF(%edx), %eax
|
||||
subl $bar@TPOFF, %eax
|
||||
movl foo@GOTNTPOFF(%edx), %ecx
|
||||
movl %gs:(%ecx), %eax
|
||||
movl %gs:bar@NTPOFF, %eax
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_386_tls=yes
|
||||
else
|
||||
libc_cv_386_tls=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_386_tls" >&5
|
||||
$as_echo "$libc_cv_386_tls" >&6; }
|
||||
if test $libc_cv_386_tls = no; then
|
||||
as_fn_error $? "the assembler must support TLS" "$LINENO" 5
|
||||
fi
|
||||
|
||||
$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
|
||||
|
@ -1,36 +0,0 @@
|
||||
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
||||
# Local configure fragment for sysdeps/i386/elf.
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and
|
||||
# linker.
|
||||
AC_CACHE_CHECK(for i386 TLS support, libc_cv_386_tls, [dnl
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .long 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 4
|
||||
.text
|
||||
baz: leal bar@TLSLDM(%ebx), %eax
|
||||
leal bar@DTPOFF(%eax), %edx
|
||||
subl foo@GOTTPOFF(%edx), %eax
|
||||
subl $bar@TPOFF, %eax
|
||||
movl foo@GOTNTPOFF(%edx), %ecx
|
||||
movl %gs:(%ecx), %eax
|
||||
movl %gs:bar@NTPOFF, %eax
|
||||
EOF
|
||||
dnl
|
||||
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
||||
libc_cv_386_tls=yes
|
||||
else
|
||||
libc_cv_386_tls=no
|
||||
fi
|
||||
rm -f conftest*])
|
||||
if test $libc_cv_386_tls = no; then
|
||||
AC_MSG_ERROR([the assembler must support TLS])
|
||||
fi
|
||||
|
||||
dnl It is always possible to access static and hidden symbols in an
|
||||
dnl position independent way.
|
||||
AC_DEFINE(PI_STATIC_AND_HIDDEN)
|
@ -1,6 +1,5 @@
|
||||
/* Startup code compliant to the ELF i386 ABI.
|
||||
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
|
||||
Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
@ -1,2 +0,0 @@
|
||||
#define DUMMIES dummy0
|
||||
#include <sysdeps/unix/start.c>
|
@ -1,186 +0,0 @@
|
||||
/* Copyright (C) 1991-1997,2004,2012 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
In addition to the permissions in the GNU Lesser General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file with other
|
||||
programs, and to distribute those programs without any restriction
|
||||
coming from the use of this file. (The GNU Lesser General Public
|
||||
License restrictions do apply in other respects; for example, they
|
||||
cover modification of the file, and distribution when not linked
|
||||
into another program.)
|
||||
|
||||
Note that people who make modified versions of this file are not
|
||||
obligated to grant this special exception for their modified
|
||||
versions; it is their choice whether to do so. The GNU Lesser
|
||||
General Public License gives permission to release a modified
|
||||
version without this exception; this exception also makes it
|
||||
possible to release a modified version which carries forward this
|
||||
exception.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifndef NO_SHLIB
|
||||
#include <sys/exec.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <link.h>
|
||||
#include <syscall.h>
|
||||
#endif
|
||||
|
||||
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||
#error This file uses GNU C extensions; you must compile with GCC version 2.
|
||||
#endif
|
||||
|
||||
/* The first piece of initialized data. */
|
||||
int __data_start = 0;
|
||||
weak_alias (__data_start, data_start)
|
||||
|
||||
extern void __libc_init (int argc, char **argv, char **envp) __THROW;
|
||||
extern int main (int argc, char **argv, char **envp) __THROW;
|
||||
|
||||
register long int sp asm("%sp"), fp asm("%fp");
|
||||
|
||||
#ifndef NO_SHLIB
|
||||
static void init_shlib (void) __THROW;
|
||||
#endif
|
||||
|
||||
#ifndef NO_EXPLICIT_START
|
||||
/* Declare _start with an explicit assembly symbol name of `start'
|
||||
(note no leading underscore). This is the name Sun's crt0.o uses,
|
||||
and programs are often linked with `ld -e start'. */
|
||||
void _start (void) asm ("start");
|
||||
#endif
|
||||
|
||||
void
|
||||
_start (void)
|
||||
{
|
||||
/* It is important that these be declared `register'.
|
||||
Otherwise, when compiled without optimization, they are put on the
|
||||
stack, which loses completely after we zero the FP. */
|
||||
register int argc;
|
||||
register char **argv, **envp;
|
||||
|
||||
/* Unwind the frame built when we entered the function. */
|
||||
asm("restore");
|
||||
|
||||
/* And clear the frame pointer. */
|
||||
fp = 0;
|
||||
|
||||
/* The argument info starts after one register
|
||||
window (64 bytes) past the SP. */
|
||||
argc = ((int *) sp)[16];
|
||||
argv = (char **) &((int *) sp)[17];
|
||||
envp = &argv[argc + 1];
|
||||
__environ = envp;
|
||||
|
||||
#ifndef NO_SHLIB
|
||||
init_shlib ();
|
||||
#endif
|
||||
|
||||
/* Allocate 24 bytes of stack space for the register save area. */
|
||||
sp -= 24;
|
||||
__libc_init (argc, argv, envp);
|
||||
|
||||
exit (main (argc, argv, envp));
|
||||
}
|
||||
|
||||
#ifndef NO_SHLIB
|
||||
|
||||
/* System calls for use by the bootstrap routine.
|
||||
These are defined here since the usual calls may be dynamically linked. */
|
||||
|
||||
int syscall (int sysno, ...) asm ("init_syscall");
|
||||
asm ("init_syscall:\n"
|
||||
" clr %g1\n"
|
||||
" ta 0\n"
|
||||
" bcc 1f\n"
|
||||
" sethi %hi(_errno), %g1\n"
|
||||
" st %o0, [%g1 + %lo(_errno)]\n"
|
||||
" sub %g0, 1, %o0\n"
|
||||
"1:retl\n"
|
||||
" nop");
|
||||
|
||||
static void
|
||||
init_shlib ()
|
||||
{
|
||||
extern struct link_dynamic _DYNAMIC;
|
||||
int so, zf;
|
||||
caddr_t somap;
|
||||
caddr_t sodmap;
|
||||
caddr_t sobssmap;
|
||||
void (*ldstart) (int, int);
|
||||
struct exec soexec;
|
||||
struct
|
||||
{
|
||||
caddr_t crt_ba;
|
||||
int crt_dzfd;
|
||||
int crt_ldfd;
|
||||
struct link_dynamic *crt_dp;
|
||||
char **crt_ep;
|
||||
caddr_t crt_bp;
|
||||
} soarg;
|
||||
|
||||
/* If not dynamically linked, do nothing. */
|
||||
if (&_DYNAMIC == 0)
|
||||
return;
|
||||
|
||||
/* Map in the dynamic linker. */
|
||||
so = syscall (SYS_open, "/usr/lib/ld.so", O_RDONLY);
|
||||
if (syscall (SYS_read, so, &soexec, sizeof (soexec)) != sizeof (soexec)
|
||||
|| soexec.a_magic != ZMAGIC)
|
||||
{
|
||||
static const char emsg[] = "crt0: no /usr/lib/ld.so\n";
|
||||
|
||||
syscall (SYS_write, 2, emsg, sizeof (emsg) - 1);
|
||||
syscall (SYS_exit, 127);
|
||||
}
|
||||
somap = (caddr_t) syscall (SYS_mmap, 0,
|
||||
soexec.a_text + soexec.a_data + soexec.a_bss,
|
||||
PROT_READ | PROT_EXEC, _MAP_NEW | MAP_PRIVATE,
|
||||
so, 0);
|
||||
sodmap = (caddr_t) syscall (SYS_mmap, somap + soexec.a_text, soexec.a_data,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
_MAP_NEW | MAP_FIXED | MAP_PRIVATE,
|
||||
so, soexec.a_text);
|
||||
zf = syscall (SYS_open, "/dev/zero", O_RDONLY);
|
||||
if (soexec.a_bss != 0)
|
||||
sobssmap = (caddr_t) syscall (SYS_mmap,
|
||||
somap + soexec.a_text + soexec.a_data,
|
||||
soexec.a_bss,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
_MAP_NEW | MAP_FIXED | MAP_PRIVATE,
|
||||
zf, 0);
|
||||
|
||||
/* Call the entry point of the dynamic linker. */
|
||||
soarg.crt_ba = somap;
|
||||
soarg.crt_dzfd = zf;
|
||||
soarg.crt_ldfd = so;
|
||||
soarg.crt_dp = &_DYNAMIC;
|
||||
soarg.crt_ep = __environ;
|
||||
soarg.crt_bp = (caddr_t) &&retaddr;
|
||||
|
||||
ldstart = (__typeof (ldstart)) (somap + soexec.a_entry);
|
||||
(*ldstart) (1, (char *) &soarg - (char *) sp);
|
||||
|
||||
retaddr:
|
||||
}
|
||||
|
||||
#endif
|
@ -1,95 +0,0 @@
|
||||
/* Copyright (C) 1991, 93, 1995-1998, 2000, 2012 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
In addition to the permissions in the GNU Lesser General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file with other
|
||||
programs, and to distribute those programs without any restriction
|
||||
coming from the use of this file. (The GNU Lesser General Public
|
||||
License restrictions do apply in other respects; for example, they
|
||||
cover modification of the file, and distribution when not linked
|
||||
into another program.)
|
||||
|
||||
Note that people who make modified versions of this file are not
|
||||
obligated to grant this special exception for their modified
|
||||
versions; it is their choice whether to do so. The GNU Lesser
|
||||
General Public License gives permission to release a modified
|
||||
version without this exception; this exception also makes it
|
||||
possible to release a modified version which carries forward this
|
||||
exception.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sysdep.h> /* In case it wants to define anything. */
|
||||
|
||||
/* The first piece of initialized data. */
|
||||
int __data_start = 0;
|
||||
weak_alias (__data_start, data_start)
|
||||
|
||||
#ifdef DUMMIES
|
||||
#define ARG_DUMMIES DUMMIES,
|
||||
#define DECL_DUMMIES int DUMMIES;
|
||||
#else
|
||||
#define ARG_DUMMIES
|
||||
#define DECL_DUMMIES
|
||||
#endif
|
||||
|
||||
extern void __libc_init (int argc, char **argv, char **envp);
|
||||
extern int main (int argc, char **argv, char **envp);
|
||||
|
||||
|
||||
/* Not a prototype because it gets called strangely. */
|
||||
static void start1();
|
||||
|
||||
#ifndef HAVE__start
|
||||
|
||||
/* N.B.: It is important that this be the first function.
|
||||
This file is the first thing in the text section. */
|
||||
void
|
||||
_start ()
|
||||
{
|
||||
start1 ();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
start1 (ARG_DUMMIES argc, argp)
|
||||
DECL_DUMMIES
|
||||
int argc;
|
||||
char *argp;
|
||||
{
|
||||
char **argv = &argp;
|
||||
|
||||
/* The environment starts just after ARGV. */
|
||||
__environ = &argv[argc + 1];
|
||||
|
||||
/* If the first thing after ARGV is the arguments
|
||||
themselves, there is no environment. */
|
||||
if ((char *) __environ == *argv)
|
||||
/* The environment is empty. Make __environ
|
||||
point at ARGV[ARGC], which is NULL. */
|
||||
--__environ;
|
||||
|
||||
/* Do C library initializations. */
|
||||
__libc_init (argc, argv, __environ);
|
||||
|
||||
/* Call the user program. */
|
||||
exit (main (argc, argv, __environ));
|
||||
}
|
367
sysdeps/x86_64/configure
vendored
367
sysdeps/x86_64/configure
vendored
@ -1,3 +1,366 @@
|
||||
# The i386 fragment also works for x86_64.
|
||||
|
||||
. $srcdir/sysdeps/i386/configure
|
||||
# as_fn_set_status STATUS
|
||||
# -----------------------
|
||||
# Set $? to STATUS, without forking.
|
||||
as_fn_set_status ()
|
||||
{
|
||||
return $1
|
||||
} # as_fn_set_status
|
||||
|
||||
# as_fn_exit STATUS
|
||||
# -----------------
|
||||
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
|
||||
as_fn_exit ()
|
||||
{
|
||||
set +e
|
||||
as_fn_set_status $1
|
||||
exit $1
|
||||
} # as_fn_exit
|
||||
if expr a : '\(a\)' >/dev/null 2>&1 &&
|
||||
test "X`expr 00001 : '.*\(...\)'`" = X001; then
|
||||
as_expr=expr
|
||||
else
|
||||
as_expr=false
|
||||
fi
|
||||
|
||||
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
|
||||
as_basename=basename
|
||||
else
|
||||
as_basename=false
|
||||
fi
|
||||
|
||||
as_me=`$as_basename -- "$0" ||
|
||||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
|
||||
X"$0" : 'X\(//\)$' \| \
|
||||
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X/"$0" |
|
||||
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
|
||||
|
||||
as_lineno_1=$LINENO as_lineno_1a=$LINENO
|
||||
as_lineno_2=$LINENO as_lineno_2a=$LINENO
|
||||
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
|
||||
test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
|
||||
# Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
|
||||
sed -n '
|
||||
p
|
||||
/[$]LINENO/=
|
||||
' <$as_myself |
|
||||
sed '
|
||||
s/[$]LINENO.*/&-/
|
||||
t lineno
|
||||
b
|
||||
:lineno
|
||||
N
|
||||
:loop
|
||||
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
|
||||
t loop
|
||||
s/-\n.*//
|
||||
' >$as_me.lineno &&
|
||||
chmod +x "$as_me.lineno" ||
|
||||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
|
||||
|
||||
# Don't try to exec as it changes $[0], causing all sort of problems
|
||||
# (the dirname of $[0] is not the place where we might find the
|
||||
# original and so on. Autoconf is especially sensitive to this).
|
||||
. "./$as_me.lineno"
|
||||
# Exit status is that of the last command.
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
# ac_fn_c_try_compile LINENO
|
||||
# --------------------------
|
||||
# Try to compile conftest.$ac_ext, and return whether this succeeded.
|
||||
ac_fn_c_try_compile ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
rm -f conftest.$ac_objext
|
||||
if { { ac_try="$ac_compile"
|
||||
case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||
$as_echo "$ac_try_echo"; } >&5
|
||||
(eval "$ac_compile") 2>conftest.err
|
||||
ac_status=$?
|
||||
if test -s conftest.err; then
|
||||
grep -v '^ *+' conftest.err >conftest.er1
|
||||
cat conftest.er1 >&5
|
||||
mv -f conftest.er1 conftest.err
|
||||
fi
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; } && {
|
||||
test -z "$ac_c_werror_flag" ||
|
||||
test ! -s conftest.err
|
||||
} && test -s conftest.$ac_objext; then :
|
||||
ac_retval=0
|
||||
else
|
||||
$as_echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_retval=1
|
||||
fi
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
as_fn_set_status $ac_retval
|
||||
|
||||
} # ac_fn_c_try_compile
|
||||
|
||||
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
|
||||
# -------------------------------------------------------
|
||||
# Tests whether HEADER exists and can be compiled using the include files in
|
||||
# INCLUDES, setting the cache variable VAR accordingly.
|
||||
ac_fn_c_check_header_compile ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||
$as_echo_n "checking for $2... " >&6; }
|
||||
if eval \${$3+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
$4
|
||||
#include <$2>
|
||||
_ACEOF
|
||||
if ac_fn_c_try_compile "$LINENO"; then :
|
||||
eval "$3=yes"
|
||||
else
|
||||
eval "$3=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
fi
|
||||
eval ac_res=\$$3
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
$as_echo "$ac_res" >&6; }
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
|
||||
} # ac_fn_c_check_header_compile
|
||||
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
|
||||
# Local configure fragment for sysdeps/x86_64.
|
||||
|
||||
|
||||
ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes. */
|
||||
"
|
||||
if test "x$ac_cv_header_cpuid_h" = xyes; then :
|
||||
|
||||
else
|
||||
as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -g produces usable source locations for assembler-with-cpp" >&5
|
||||
$as_echo_n "checking if -g produces usable source locations for assembler-with-cpp... " >&6; }
|
||||
if ${libc_cv_cpp_asm_debuginfo+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat > conftest.S <<EOF
|
||||
#include "confdefs.h"
|
||||
|
||||
/* comment on
|
||||
two lines */
|
||||
${libc_cv_dot_text}
|
||||
${libc_cv_asm_global_directive} foo
|
||||
foo:
|
||||
/* Unfortunately this test only works for a real instruction,
|
||||
not for any of the machine-independent pseudo-ops.
|
||||
So we just have to assume everybody has a "nop". */
|
||||
nop
|
||||
/* comment */
|
||||
nop
|
||||
/* comment */
|
||||
nop
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CPPFLAGS $ASFLAGS -g -c conftest.S 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; } && {
|
||||
ac_pattern='conftest\.S'
|
||||
{ ac_try='readelf --debug-dump=line conftest.o |
|
||||
grep $ac_pattern 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }
|
||||
}; then
|
||||
libc_cv_cpp_asm_debuginfo=yes
|
||||
else
|
||||
libc_cv_cpp_asm_debuginfo=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cpp_asm_debuginfo" >&5
|
||||
$as_echo "$libc_cv_cpp_asm_debuginfo" >&6; }
|
||||
if test $libc_cv_cpp_asm_debuginfo = yes; then
|
||||
$as_echo "#define HAVE_CPP_ASM_DEBUGINFO 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSE4 support" >&5
|
||||
$as_echo_n "checking for SSE4 support... " >&6; }
|
||||
if ${libc_cv_cc_sse4+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if { ac_try='${CC-cc} -msse4 -xc /dev/null -S -o /dev/null'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_cc_sse4=yes
|
||||
else
|
||||
libc_cv_cc_sse4=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_sse4" >&5
|
||||
$as_echo "$libc_cv_cc_sse4" >&6; }
|
||||
if test $libc_cv_cc_sse4 = yes; then
|
||||
$as_echo "#define HAVE_SSE4_SUPPORT 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX support" >&5
|
||||
$as_echo_n "checking for AVX support... " >&6; }
|
||||
if ${libc_cv_cc_avx+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if { ac_try='${CC-cc} -mavx -xc /dev/null -S -o /dev/null'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_cc_avx=yes
|
||||
else
|
||||
libc_cv_cc_avx=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_avx" >&5
|
||||
$as_echo "$libc_cv_cc_avx" >&6; }
|
||||
if test $libc_cv_cc_avx = yes; then
|
||||
$as_echo "#define HAVE_AVX_SUPPORT 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX encoding of SSE instructions" >&5
|
||||
$as_echo_n "checking for AVX encoding of SSE instructions... " >&6; }
|
||||
if ${libc_cv_cc_sse2avx+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if { ac_try='${CC-cc} -msse2avx -xc /dev/null -S -o /dev/null'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_cc_sse2avx=yes
|
||||
else
|
||||
libc_cv_cc_sse2avx=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_sse2avx" >&5
|
||||
$as_echo "$libc_cv_cc_sse2avx" >&6; }
|
||||
if test $libc_cv_cc_sse2avx = yes; then
|
||||
$as_echo "#define HAVE_SSE2AVX_SUPPORT 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FMA4 support" >&5
|
||||
$as_echo_n "checking for FMA4 support... " >&6; }
|
||||
if ${libc_cv_cc_fma4+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if { ac_try='${CC-cc} -mfma4 -xc /dev/null -S -o /dev/null'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_cc_fma4=yes
|
||||
else
|
||||
libc_cv_cc_fma4=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_fma4" >&5
|
||||
$as_echo "$libc_cv_cc_fma4" >&6; }
|
||||
if test $libc_cv_cc_fma4 = yes; then
|
||||
$as_echo "#define HAVE_FMA4_SUPPORT 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mno-vzeroupper support" >&5
|
||||
$as_echo_n "checking for -mno-vzeroupper support... " >&6; }
|
||||
if ${libc_cv_cc_novzeroupper+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if { ac_try='${CC-cc} -mno-vzeroupper -xc /dev/null -S -o /dev/null'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_cc_novzeroupper=yes
|
||||
else
|
||||
libc_cv_cc_novzeroupper=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_novzeroupper" >&5
|
||||
$as_echo "$libc_cv_cc_novzeroupper" >&6; }
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and linker.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86-64 TLS support" >&5
|
||||
$as_echo_n "checking for x86-64 TLS support... " >&6; }
|
||||
if ${libc_cv_x86_64_tls+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .quad 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 8
|
||||
.text
|
||||
baz: leaq bar@TLSLD(%rip), %rdi
|
||||
leaq bar@DTPOFF(%rax), %rcx
|
||||
addq foo@GOTTPOFF(%rip), %rax
|
||||
movq $bar@TPOFF, %rdx
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_x86_64_tls=yes
|
||||
else
|
||||
libc_cv_x86_64_tls=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_x86_64_tls" >&5
|
||||
$as_echo "$libc_cv_x86_64_tls" >&6; }
|
||||
if test $libc_cv_x86_64_tls = no; then
|
||||
as_fn_error $? "the assembler must support TLS" "$LINENO" 5
|
||||
fi
|
||||
|
||||
$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
|
||||
|
||||
# work around problem with autoconf and empty lines at the end of files
|
||||
|
122
sysdeps/x86_64/configure.in
Normal file
122
sysdeps/x86_64/configure.in
Normal file
@ -0,0 +1,122 @@
|
||||
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
||||
# Local configure fragment for sysdeps/x86_64.
|
||||
|
||||
AC_CHECK_HEADER([cpuid.h], ,
|
||||
[AC_MSG_ERROR([gcc must provide the <cpuid.h> header])],
|
||||
[/* No default includes. */])
|
||||
|
||||
AC_CACHE_CHECK(if -g produces usable source locations for assembler-with-cpp,
|
||||
libc_cv_cpp_asm_debuginfo, [dnl
|
||||
cat > conftest.S <<EOF
|
||||
#include "confdefs.h"
|
||||
|
||||
/* comment on
|
||||
two lines */
|
||||
${libc_cv_dot_text}
|
||||
${libc_cv_asm_global_directive} foo
|
||||
foo:
|
||||
/* Unfortunately this test only works for a real instruction,
|
||||
not for any of the machine-independent pseudo-ops.
|
||||
So we just have to assume everybody has a "nop". */
|
||||
nop
|
||||
/* comment */
|
||||
nop
|
||||
/* comment */
|
||||
nop
|
||||
EOF
|
||||
if AC_TRY_COMMAND([${CC-cc} $CPPFLAGS $ASFLAGS -g -c conftest.S 1>&AS_MESSAGE_LOG_FD]) && {
|
||||
ac_pattern='conftest\.S'
|
||||
AC_TRY_COMMAND([readelf --debug-dump=line conftest.o |
|
||||
grep $ac_pattern 1>&AS_MESSAGE_LOG_FD])
|
||||
}; then
|
||||
libc_cv_cpp_asm_debuginfo=yes
|
||||
else
|
||||
libc_cv_cpp_asm_debuginfo=no
|
||||
fi
|
||||
rm -f conftest*])AC_SUBST(libc_cv_cpp_asm_debuginfo)
|
||||
if test $libc_cv_cpp_asm_debuginfo = yes; then
|
||||
AC_DEFINE(HAVE_CPP_ASM_DEBUGINFO)
|
||||
fi
|
||||
|
||||
dnl Check if -msse4 works.
|
||||
AC_CACHE_CHECK(for SSE4 support, libc_cv_cc_sse4, [dnl
|
||||
if AC_TRY_COMMAND([${CC-cc} -msse4 -xc /dev/null -S -o /dev/null]); then
|
||||
libc_cv_cc_sse4=yes
|
||||
else
|
||||
libc_cv_cc_sse4=no
|
||||
fi])
|
||||
if test $libc_cv_cc_sse4 = yes; then
|
||||
AC_DEFINE(HAVE_SSE4_SUPPORT)
|
||||
fi
|
||||
|
||||
dnl Check if -mavx works.
|
||||
AC_CACHE_CHECK(for AVX support, libc_cv_cc_avx, [dnl
|
||||
if AC_TRY_COMMAND([${CC-cc} -mavx -xc /dev/null -S -o /dev/null]); then
|
||||
libc_cv_cc_avx=yes
|
||||
else
|
||||
libc_cv_cc_avx=no
|
||||
fi])
|
||||
if test $libc_cv_cc_avx = yes; then
|
||||
AC_DEFINE(HAVE_AVX_SUPPORT)
|
||||
fi
|
||||
|
||||
dnl Check if -msse2avx works.
|
||||
AC_CACHE_CHECK(for AVX encoding of SSE instructions, libc_cv_cc_sse2avx, [dnl
|
||||
if AC_TRY_COMMAND([${CC-cc} -msse2avx -xc /dev/null -S -o /dev/null]); then
|
||||
libc_cv_cc_sse2avx=yes
|
||||
else
|
||||
libc_cv_cc_sse2avx=no
|
||||
fi])
|
||||
if test $libc_cv_cc_sse2avx = yes; then
|
||||
AC_DEFINE(HAVE_SSE2AVX_SUPPORT)
|
||||
fi
|
||||
|
||||
dnl Check if -mfma4 works.
|
||||
AC_CACHE_CHECK(for FMA4 support, libc_cv_cc_fma4, [dnl
|
||||
if AC_TRY_COMMAND([${CC-cc} -mfma4 -xc /dev/null -S -o /dev/null]); then
|
||||
libc_cv_cc_fma4=yes
|
||||
else
|
||||
libc_cv_cc_fma4=no
|
||||
fi])
|
||||
if test $libc_cv_cc_fma4 = yes; then
|
||||
AC_DEFINE(HAVE_FMA4_SUPPORT)
|
||||
fi
|
||||
|
||||
dnl Check if -mno-vzeroupper works.
|
||||
AC_CACHE_CHECK(for -mno-vzeroupper support, libc_cv_cc_novzeroupper, [dnl
|
||||
if AC_TRY_COMMAND([${CC-cc} -mno-vzeroupper -xc /dev/null -S -o /dev/null]); then
|
||||
libc_cv_cc_novzeroupper=yes
|
||||
else
|
||||
libc_cv_cc_novzeroupper=no
|
||||
fi])
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and linker.
|
||||
AC_CACHE_CHECK(for x86-64 TLS support, libc_cv_x86_64_tls, [dnl
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .quad 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 8
|
||||
.text
|
||||
baz: leaq bar@TLSLD(%rip), %rdi
|
||||
leaq bar@DTPOFF(%rax), %rcx
|
||||
addq foo@GOTTPOFF(%rip), %rax
|
||||
movq $bar@TPOFF, %rdx
|
||||
EOF
|
||||
dnl
|
||||
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
||||
libc_cv_x86_64_tls=yes
|
||||
else
|
||||
libc_cv_x86_64_tls=no
|
||||
fi
|
||||
rm -f conftest*])
|
||||
if test $libc_cv_x86_64_tls = no; then
|
||||
AC_MSG_ERROR([the assembler must support TLS])
|
||||
fi
|
||||
|
||||
dnl It is always possible to access static and hidden symbols in an
|
||||
dnl position independent way.
|
||||
AC_DEFINE(PI_STATIC_AND_HIDDEN)
|
||||
# work around problem with autoconf and empty lines at the end of files
|
125
sysdeps/x86_64/elf/configure
vendored
125
sysdeps/x86_64/elf/configure
vendored
@ -1,125 +0,0 @@
|
||||
|
||||
# as_fn_set_status STATUS
|
||||
# -----------------------
|
||||
# Set $? to STATUS, without forking.
|
||||
as_fn_set_status ()
|
||||
{
|
||||
return $1
|
||||
} # as_fn_set_status
|
||||
|
||||
# as_fn_exit STATUS
|
||||
# -----------------
|
||||
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
|
||||
as_fn_exit ()
|
||||
{
|
||||
set +e
|
||||
as_fn_set_status $1
|
||||
exit $1
|
||||
} # as_fn_exit
|
||||
if expr a : '\(a\)' >/dev/null 2>&1 &&
|
||||
test "X`expr 00001 : '.*\(...\)'`" = X001; then
|
||||
as_expr=expr
|
||||
else
|
||||
as_expr=false
|
||||
fi
|
||||
|
||||
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
|
||||
as_basename=basename
|
||||
else
|
||||
as_basename=false
|
||||
fi
|
||||
|
||||
as_me=`$as_basename -- "$0" ||
|
||||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
|
||||
X"$0" : 'X\(//\)$' \| \
|
||||
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
$as_echo X/"$0" |
|
||||
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\/\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'`
|
||||
|
||||
|
||||
as_lineno_1=$LINENO as_lineno_1a=$LINENO
|
||||
as_lineno_2=$LINENO as_lineno_2a=$LINENO
|
||||
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
|
||||
test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
|
||||
# Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
|
||||
sed -n '
|
||||
p
|
||||
/[$]LINENO/=
|
||||
' <$as_myself |
|
||||
sed '
|
||||
s/[$]LINENO.*/&-/
|
||||
t lineno
|
||||
b
|
||||
:lineno
|
||||
N
|
||||
:loop
|
||||
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
|
||||
t loop
|
||||
s/-\n.*//
|
||||
' >$as_me.lineno &&
|
||||
chmod +x "$as_me.lineno" ||
|
||||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
|
||||
|
||||
# Don't try to exec as it changes $[0], causing all sort of problems
|
||||
# (the dirname of $[0] is not the place where we might find the
|
||||
# original and so on. Autoconf is especially sensitive to this).
|
||||
. "./$as_me.lineno"
|
||||
# Exit status is that of the last command.
|
||||
exit
|
||||
}
|
||||
|
||||
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
|
||||
# Local configure fragment for sysdeps/x86_64/elf.
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and linker.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86-64 TLS support" >&5
|
||||
$as_echo_n "checking for x86-64 TLS support... " >&6; }
|
||||
if ${libc_cv_x86_64_tls+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .quad 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 8
|
||||
.text
|
||||
baz: leaq bar@TLSLD(%rip), %rdi
|
||||
leaq bar@DTPOFF(%rax), %rcx
|
||||
addq foo@GOTTPOFF(%rip), %rax
|
||||
movq $bar@TPOFF, %rdx
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
|
||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; }; then
|
||||
libc_cv_x86_64_tls=yes
|
||||
else
|
||||
libc_cv_x86_64_tls=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_x86_64_tls" >&5
|
||||
$as_echo "$libc_cv_x86_64_tls" >&6; }
|
||||
if test $libc_cv_x86_64_tls = no; then
|
||||
as_fn_error $? "the assembler must support TLS" "$LINENO" 5
|
||||
fi
|
||||
|
||||
$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
|
||||
|
||||
# work around problem with autoconf and empty lines at the end of files
|
@ -1,33 +0,0 @@
|
||||
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
||||
# Local configure fragment for sysdeps/x86_64/elf.
|
||||
|
||||
# Check for support of thread-local storage handling in assembler and linker.
|
||||
AC_CACHE_CHECK(for x86-64 TLS support, libc_cv_x86_64_tls, [dnl
|
||||
cat > conftest.s <<\EOF
|
||||
.section ".tdata", "awT", @progbits
|
||||
.globl foo
|
||||
foo: .quad 1
|
||||
.section ".tbss", "awT", @nobits
|
||||
.globl bar
|
||||
bar: .skip 8
|
||||
.text
|
||||
baz: leaq bar@TLSLD(%rip), %rdi
|
||||
leaq bar@DTPOFF(%rax), %rcx
|
||||
addq foo@GOTTPOFF(%rip), %rax
|
||||
movq $bar@TPOFF, %rdx
|
||||
EOF
|
||||
dnl
|
||||
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
||||
libc_cv_x86_64_tls=yes
|
||||
else
|
||||
libc_cv_x86_64_tls=no
|
||||
fi
|
||||
rm -f conftest*])
|
||||
if test $libc_cv_x86_64_tls = no; then
|
||||
AC_MSG_ERROR([the assembler must support TLS])
|
||||
fi
|
||||
|
||||
dnl It is always possible to access static and hidden symbols in an
|
||||
dnl position independent way.
|
||||
AC_DEFINE(PI_STATIC_AND_HIDDEN)
|
||||
# work around problem with autoconf and empty lines at the end of files
|
Loading…
Reference in New Issue
Block a user