(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
mips/
readelflib.c
       1  /* Copyright (C) 1999-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library.  If not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  
      19  int process_elf32_file (const char *file_name, const char *lib,
      20  			int *flag, unsigned int *isa_level, char **soname,
      21  			void *file_contents, size_t file_length);
      22  int process_elf64_file (const char *file_name, const char *lib,
      23  			int *flag, unsigned int *isa_level, char **soname,
      24  			void *file_contents, size_t file_length);
      25  
      26  /* Returns 0 if everything is ok, != 0 in case of error.  */
      27  int
      28  process_elf_file (const char *file_name, const char *lib, int *flag,
      29  		  unsigned int *isa_level, char **soname, void *file_contents,
      30  		  size_t file_length)
      31  {
      32    union
      33      {
      34        Elf64_Ehdr *eh64;
      35        Elf32_Ehdr *eh32;
      36        ElfW(Ehdr) *eh;
      37      }
      38    elf_header;
      39    int ret;
      40  
      41    elf_header.eh = file_contents;
      42    if (elf_header.eh->e_ident [EI_CLASS] == ELFCLASS32)
      43      {
      44        ret = process_elf32_file (file_name, lib, flag, isa_level, soname,
      45  				file_contents, file_length);
      46        if (!ret)
      47  	{
      48  	  Elf32_Word flags = elf_header.eh32->e_flags;
      49  	  int nan2008 = (flags & EF_MIPS_NAN2008) != 0;
      50  
      51  	  /* n32 libraries are always libc.so.6+, o32 only if 2008 NaN.  */
      52  	  if ((flags & EF_MIPS_ABI2) != 0)
      53  	    *flag = (nan2008 ? FLAG_MIPS64_LIBN32_NAN2008
      54  		     : FLAG_MIPS64_LIBN32) | FLAG_ELF_LIBC6;
      55  	  else if (nan2008)
      56  	    *flag = FLAG_MIPS_LIB32_NAN2008 | FLAG_ELF_LIBC6;
      57  	}
      58      }
      59    else
      60      {
      61        ret = process_elf64_file (file_name, lib, flag, isa_level, soname,
      62  				file_contents, file_length);
      63        /* n64 libraries are always libc.so.6+.  */
      64        if (!ret)
      65  	{
      66  	  Elf64_Word flags = elf_header.eh64->e_flags;
      67  	  int nan2008 = (flags & EF_MIPS_NAN2008) != 0;
      68  
      69  	  *flag = (nan2008 ? FLAG_MIPS64_LIBN64_NAN2008
      70  		   : FLAG_MIPS64_LIBN64) | FLAG_ELF_LIBC6;
      71  	}
      72      }
      73  
      74    return ret;
      75  }
      76  
      77  #undef __ELF_NATIVE_CLASS
      78  #undef process_elf_file
      79  #define process_elf_file process_elf32_file
      80  #define __ELF_NATIVE_CLASS 32
      81  #include "elf/readelflib.c"
      82  
      83  #undef __ELF_NATIVE_CLASS
      84  #undef process_elf_file
      85  #define process_elf_file process_elf64_file
      86  #define __ELF_NATIVE_CLASS 64
      87  #include "elf/readelflib.c"