root / prex0.9.0 / bsp / boot / ppc / arch / elf_reloc.c @ 03e9c04a
History  View  Annotate  Download (2.78 KB)
1 
/*


2 
* Copyright (c) 2009, Kohsuke Ohtani

3 
* All rights reserved.

4 
*

5 
* Redistribution and use in source and binary forms, with or without

6 
* modification, are permitted provided that the following conditions

7 
* are met:

8 
* 1. Redistributions of source code must retain the above copyright

9 
* notice, this list of conditions and the following disclaimer.

10 
* 2. Redistributions in binary form must reproduce the above copyright

11 
* notice, this list of conditions and the following disclaimer in the

12 
* documentation and/or other materials provided with the distribution.

13 
* 3. Neither the name of the author nor the names of any cocontributors

14 
* may be used to endorse or promote products derived from this software

15 
* without specific prior written permission.

16 
*

17 
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND

18 
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

19 
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

20 
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE

21 
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

22 
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

23 
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

24 
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

25 
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

26 
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

27 
* SUCH DAMAGE.

28 
*/

29  
30 
#include <sys/param.h> 
31 
#include <sys/elf.h> 
32 
#include <boot.h> 
33  
34 
int

35 
relocate_rel(Elf32_Rel *rel, Elf32_Addr sym_val, char *target_sec)

36 
{ 
37  
38 
panic("invalid relocation type");

39 
return 1; 
40 
} 
41  
42 
int

43 
relocate_rela(Elf32_Rela *rela, Elf32_Addr sym_val, char *target_sect)

44 
{ 
45 
Elf32_Addr *where; 
46 
uint32_t val; 
47  
48 
where = (Elf32_Addr *)(target_sect + rela>r_offset); 
49 
val = sym_val + rela>r_addend; 
50  
51 
switch (ELF32_R_TYPE(rela>r_info)) {

52 
case R_PPC_NONE:

53 
break;

54 
case R_PPC_ADDR32:

55 
ELFDBG(("R_PPC_ADDR32\n"));

56 
*(uint32_t *)where = val; 
57 
break;

58 
case R_PPC_ADDR16_LO:

59 
ELFDBG(("R_PPC_ADDR16_LO\n"));

60 
*(uint16_t *)where = (uint16_t)val; 
61 
break;

62 
case R_PPC_ADDR16_HI:

63 
ELFDBG(("R_PPC_ADDR16_HI\n"));

64 
*(uint16_t *)where = (uint16_t)(val >> 16);

65 
break;

66 
case R_PPC_ADDR16_HA:

67 
ELFDBG(("R_PPC_ADDR16_HA\n"));

68 
*(uint16_t *)where = (uint16_t)((val + 0x8000) >> 16); 
69 
break;

70 
case R_PPC_REL24:

71 
ELFDBG(("R_PPC_REL24\n"));

72 
*(uint32_t *)where = 
73 
(*(uint32_t *)where & ~0x03fffffc)

74 
 ((val  (uint32_t)where) 
75 
& 0x03fffffc);

76 
break;

77 
case R_PPC_REL32:

78 
ELFDBG(("R_PPC_REL32\n"));

79 
*(uint32_t *)where = val  (uint32_t)where; 
80 
break;

81 
default:

82 
ELFDBG(("Unkown relocation type=%d\n",

83 
ELF32_R_TYPE(rela>r_info))); 
84 
panic("relocation fail");

85 
return 1; 
86 
} 
87 
return 0; 
88 
} 