home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1999 May / pcp151c.iso / misc / src / install / modutils / obj / obj_sparc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-06  |  4.8 KB  |  201 lines

  1. /* Sparc specific support for Elf loading and relocation.
  2.    Copyright 1996, 1997 Linux International.
  3.  
  4.    Contributed by Richard Henderson <rth@tamu.edu>
  5.  
  6.    This file is part of the Linux modutils.
  7.  
  8.    This program is free software; you can redistribute it and/or modify it
  9.    under the terms of the GNU General Public License as published by the
  10.    Free Software Foundation; either version 2 of the License, or (at your
  11.    option) any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful, but
  14.    WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.    General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software Foundation,
  20.    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  21.  
  22. #ident "$Id: obj_sparc.c,v 1.1.1.1 1998/01/06 20:51:08 ewt Exp $"
  23.  
  24. #include <stddef.h>
  25. #include <module.h>
  26. #include <obj.h>
  27. #include <util.h>
  28.  
  29.  
  30. /*======================================================================*/
  31.  
  32. struct obj_file *
  33. arch_new_file (void)
  34. {
  35.   return xmalloc(sizeof(struct obj_file));
  36. }
  37.  
  38. struct obj_section *
  39. arch_new_section (void)
  40. {
  41.   return xmalloc(sizeof(struct obj_section));
  42. }
  43.  
  44. struct obj_symbol *
  45. arch_new_symbol (void)
  46. {
  47.   return xmalloc(sizeof(struct obj_symbol));
  48. }
  49.  
  50.  
  51. enum obj_reloc
  52. arch_apply_relocation (struct obj_file *ef,
  53.                struct obj_section *targsec,
  54.                struct obj_section *symsec,
  55.                struct obj_symbol *sym,
  56.                Elf32_Rela *rel,
  57.                Elf32_Addr v)
  58. {
  59.   Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
  60.   Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
  61.  
  62.   enum obj_reloc ret = obj_reloc_ok;
  63.  
  64.   switch (ELF32_R_TYPE(rel->r_info))
  65.     {
  66.     case R_SPARC_NONE:
  67.       break;
  68.     case R_SPARC_8:
  69.       if (v > 0xff)
  70.     ret = obj_reloc_overflow;
  71.       *loc = (*loc & ~0xff) | (v & 0xff);
  72.       break;
  73.     case R_SPARC_16:
  74.       if (v > 0xffff)
  75.     ret = obj_reloc_overflow;
  76.       *loc = (*loc & ~0xffff) | (v & 0xffff);
  77.       break;
  78.     case R_SPARC_32:
  79.       *loc = v;
  80.       break;
  81.     case R_SPARC_DISP8:
  82.       v -= dot;
  83.       if (v > 0xff)
  84.         ret = obj_reloc_overflow;
  85.       *loc = (*loc & ~0xff) | (v & 0xff);
  86.       break;
  87.     case R_SPARC_DISP16:
  88.       v -= dot;
  89.       if (v > 0xffff)
  90.     ret = obj_reloc_overflow;
  91.       *loc = (*loc & ~0xffff) | (v & 0xffff);
  92.       break;
  93.     case R_SPARC_DISP32:
  94.       v -= dot;
  95.       *loc = v;
  96.       break;
  97.     case R_SPARC_WDISP30:
  98.       v -= dot;
  99.       if (v % 4)
  100.     ret = obj_reloc_dangerous;
  101.       *loc = (*loc & ~0x3fffffff) | (v >> 2);
  102.       break;
  103.     case R_SPARC_WDISP22:
  104.       v -= dot;
  105.       if (v % 4)
  106.     ret = obj_reloc_dangerous;
  107.       *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff);
  108.       break;
  109.     case R_SPARC_HI22:
  110.       *loc = (*loc & ~0x3fffff) | (v >> 10);
  111.       break;
  112.     case R_SPARC_22:
  113.       if (v > 0x3fffff)
  114.     ret = obj_reloc_overflow;
  115.       *loc = (*loc & ~0x3fffff) | (v & 0x3fffff);
  116.       break;
  117.     case R_SPARC_13:
  118.       if (v > 0x1fff)
  119.     ret = obj_reloc_overflow;
  120.       *loc = (*loc & ~0x1fff) | (v & 0x1fff);
  121.       break;
  122.     case R_SPARC_LO10:
  123.       *loc = (*loc & ~0x3ff) | (v & 0x3ff);
  124.       break;
  125.  
  126.     case R_SPARC_PC10:
  127.       v -= dot;
  128.       *loc = (*loc & ~0x3ff) | (v & 0x3ff);
  129.       break;
  130.     case R_SPARC_PC22:
  131.       v -= dot;
  132.       *loc = (*loc & ~0x3fffff) | (v >> 10);
  133.       break;
  134.  
  135.     case R_SPARC_UA32:
  136.       *(((char *)loc) + 0) = (char)(v >> 24);
  137.       *(((char *)loc) + 1) = (char)(v >> 16);
  138.       *(((char *)loc) + 2) = (char)(v >> 8);
  139.       *(((char *)loc) + 3) = (char)v;
  140.       break;
  141.  
  142. #ifdef R_SPARC_10
  143.     case R_SPARC_10:
  144.       if (v > 0x3ff)
  145.     ret = obj_reloc_overflow;
  146.       *loc = (*loc & ~0x3ff) | (v & 0x3ff);
  147.       break;
  148.     case R_SPARC_11:
  149.       if (v > 0x7ff)
  150.     ret = obj_reloc_overflow;
  151.       *loc = (*loc & ~0x7ff) | (v & 0x7ff);
  152.       break;
  153.     case R_SPARC_WDISP16:
  154.       v -= dot;
  155.       if (v % 4)
  156.     ret = obj_reloc_dangerous;
  157.       *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff);
  158.       break;
  159.     case R_SPARC_WDISP19:
  160.       v -= dot;
  161.       if (v % 4)
  162.     ret = obj_reloc_dangerous;
  163.       *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff);
  164.       break;
  165.     case R_SPARC_7:
  166.       if (v > 0x7f)
  167.     ret = obj_reloc_overflow;
  168.       *loc = (*loc & ~0x7f) | (v & 0x7f);
  169.       break;
  170.     case R_SPARC_5:
  171.       if (v > 0x1f)
  172.     ret = obj_reloc_overflow;
  173.       *loc = (*loc & ~0x1f) | (v & 0x1f);
  174.       break;
  175.     case R_SPARC_6:
  176.       if (v > 0x3f)
  177.     ret = obj_reloc_overflow;
  178.       *loc = (*loc & ~0x3f) | (v & 0x3f);
  179.       break;
  180. #endif /* R_SPARC_10 */
  181.  
  182.     default:
  183.       ret = obj_reloc_unhandled;
  184.       break;
  185.     }
  186.  
  187.   return ret;
  188. }
  189.  
  190. int
  191. arch_create_got (struct obj_file *ef)
  192. {
  193.   return 1;
  194. }
  195.  
  196. int
  197. arch_init_module (struct obj_file *f, struct new_module *mod)
  198. {
  199.   return 1;
  200. }
  201.