1 /* Machine-dependent ELF dynamic relocation functions.  PowerPC64 version.
2    Copyright (C) 1995-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14 
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If
17    not, see <https://www.gnu.org/licenses/>.  */
18 
19 #include <string.h>
20 #include <unistd.h>
21 #include <ldsodefs.h>
22 #include <_itoa.h>
23 #include <dl-machine.h>
24 
25 void
_dl_reloc_overflow(struct link_map * map,const char * name,Elf64_Addr * const reloc_addr,const Elf64_Sym * refsym)26 _dl_reloc_overflow (struct link_map *map,
27 		    const char *name,
28 		    Elf64_Addr *const reloc_addr,
29 		    const Elf64_Sym *refsym)
30 {
31   char buffer[1024];
32   char *t;
33   t = stpcpy (buffer, name);
34   /* Notice that _itoa_word() writes characters from the higher address to the
35      lower address, requiring the destination string to reserve all the
36      required size before the call.  */
37   t = stpcpy (t, " reloc at 0x0000000000000000");
38   _itoa_word ((unsigned long) reloc_addr, t, 16, 0);
39   if (refsym)
40     {
41       const char *strtab;
42 
43       strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
44       t = stpcpy (t, " for symbol `");
45       t = stpcpy (t, strtab + refsym->st_name);
46       t = stpcpy (t, "'");
47     }
48   t = stpcpy (t, " out of range");
49   _dl_signal_error (0, map->l_name, NULL, buffer);
50 }
51 
52 #if _CALL_ELF == 2
53 void
_dl_error_localentry(struct link_map * map,const Elf64_Sym * refsym)54 _dl_error_localentry (struct link_map *map, const Elf64_Sym *refsym)
55 {
56   char buffer[1024];
57   char *t;
58   const char *strtab;
59 
60   strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
61   t = stpcpy (buffer, "expected localentry:0 `");
62   t = stpcpy (t, strtab + refsym->st_name);
63   t = stpcpy (t, "'");
64   _dl_signal_error (0, map->l_name, NULL, buffer);
65 }
66 #endif
67