1185 |
|
|
1186 |
#endif /* CONFIG_FORMAT_MACH */ |
#endif /* CONFIG_FORMAT_MACH */ |
1187 |
|
|
1188 |
|
void get_reloc_expr(char *name, int name_size, const char *sym_name) |
1189 |
|
{ |
1190 |
|
const char *p; |
1191 |
|
|
1192 |
|
if (strstart(sym_name, "__op_param", &p)) { |
1193 |
|
snprintf(name, name_size, "param%s", p); |
1194 |
|
} else if (strstart(sym_name, "__op_gen_label", &p)) { |
1195 |
|
snprintf(name, name_size, "gen_labels[param%s]", p); |
1196 |
|
} else { |
1197 |
|
#ifdef HOST_SPARC |
1198 |
|
if (sym_name[0] == '.') |
1199 |
|
snprintf(name, sizeof(name), |
1200 |
|
"(long)(&__dot_%s)", |
1201 |
|
sym_name + 1); |
1202 |
|
else |
1203 |
|
#endif |
1204 |
|
snprintf(name, name_size, "(long)(&%s)", sym_name); |
1205 |
|
} |
1206 |
|
} |
1207 |
|
|
1208 |
#ifdef HOST_ARM |
#ifdef HOST_ARM |
1209 |
|
|
1210 |
int arm_emit_ldr_info(const char *name, unsigned long start_offset, |
int arm_emit_ldr_info(const char *name, unsigned long start_offset, |
1264 |
if (rel->r_offset == (pc_offset + start_offset)) { |
if (rel->r_offset == (pc_offset + start_offset)) { |
1265 |
sym_name = get_rel_sym_name(rel); |
sym_name = get_rel_sym_name(rel); |
1266 |
/* the compiler leave some unnecessary references to the code */ |
/* the compiler leave some unnecessary references to the code */ |
1267 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(relname, sizeof(relname), sym_name); |
|
snprintf(relname, sizeof(relname), "param%s", p); |
|
|
} else { |
|
|
snprintf(relname, sizeof(relname), "(long)(&%s)", sym_name); |
|
|
} |
|
1268 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1269 |
if (type != R_ARM_ABS32) |
if (type != R_ARM_ABS32) |
1270 |
error("%s: unsupported data relocation", name); |
error("%s: unsupported data relocation", name); |
1657 |
continue; |
continue; |
1658 |
} |
} |
1659 |
|
|
1660 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else if (strstart(sym_name, "__op_gen_label", &p)) { |
|
|
snprintf(name, sizeof(name), "gen_labels[param%s]", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
1661 |
addend = get32((uint32_t *)(text + rel->r_offset)); |
addend = get32((uint32_t *)(text + rel->r_offset)); |
1662 |
#ifdef CONFIG_FORMAT_ELF |
#ifdef CONFIG_FORMAT_ELF |
1663 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1715 |
if (rel->r_offset >= start_offset && |
if (rel->r_offset >= start_offset && |
1716 |
rel->r_offset < start_offset + copy_size) { |
rel->r_offset < start_offset + copy_size) { |
1717 |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
1718 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
1719 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1720 |
addend = rel->r_addend; |
addend = rel->r_addend; |
1721 |
switch(type) { |
switch(type) { |
1759 |
continue; |
continue; |
1760 |
} |
} |
1761 |
|
|
1762 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
1763 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1764 |
addend = rel->r_addend; |
addend = rel->r_addend; |
1765 |
switch(type) { |
switch(type) { |
1844 |
continue; /* dunno how to handle without final_sym_name */ |
continue; /* dunno how to handle without final_sym_name */ |
1845 |
} |
} |
1846 |
|
|
1847 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(final_sym_name, sizeof(final_sym_name), |
1848 |
snprintf(final_sym_name, sizeof(final_sym_name), "param%s", p); |
sym_name); |
|
} else { |
|
|
snprintf(final_sym_name, sizeof(final_sym_name), "(long)(&%s)", sym_name); |
|
|
} |
|
|
|
|
1849 |
switch(type) { |
switch(type) { |
1850 |
case PPC_RELOC_BR24: |
case PPC_RELOC_BR24: |
1851 |
fprintf(outfile, "{\n"); |
fprintf(outfile, "{\n"); |
1883 |
if (rel->r_offset >= start_offset && |
if (rel->r_offset >= start_offset && |
1884 |
rel->r_offset < start_offset + copy_size) { |
rel->r_offset < start_offset + copy_size) { |
1885 |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
1886 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
1887 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1888 |
addend = rel->r_addend; |
addend = rel->r_addend; |
1889 |
switch(type) { |
switch(type) { |
1967 |
for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
1968 |
if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) { |
if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) { |
1969 |
sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name; |
1970 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
1971 |
type = ELF64_R_TYPE(rel->r_info); |
type = ELF64_R_TYPE(rel->r_info); |
1972 |
addend = rel->r_addend; |
addend = rel->r_addend; |
1973 |
switch(type) { |
switch(type) { |
1990 |
if (rel->r_offset >= start_offset && |
if (rel->r_offset >= start_offset && |
1991 |
rel->r_offset < start_offset + copy_size) { |
rel->r_offset < start_offset + copy_size) { |
1992 |
sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name; |
1993 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
if (sym_name[0] == '.') |
|
|
snprintf(name, sizeof(name), |
|
|
"(long)(&__dot_%s)", |
|
|
sym_name + 1); |
|
|
else |
|
|
snprintf(name, sizeof(name), |
|
|
"(long)(&%s)", sym_name); |
|
|
} |
|
1994 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
1995 |
addend = rel->r_addend; |
addend = rel->r_addend; |
1996 |
switch(type) { |
switch(type) { |
2045 |
if (rel->r_offset >= start_offset && |
if (rel->r_offset >= start_offset && |
2046 |
rel->r_offset < start_offset + copy_size) { |
rel->r_offset < start_offset + copy_size) { |
2047 |
sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name; |
2048 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
2049 |
type = ELF64_R_TYPE(rel->r_info); |
type = ELF64_R_TYPE(rel->r_info); |
2050 |
addend = rel->r_addend; |
addend = rel->r_addend; |
2051 |
switch(type) { |
switch(type) { |
2107 |
/* the compiler leave some unnecessary references to the code */ |
/* the compiler leave some unnecessary references to the code */ |
2108 |
if (sym_name[0] == '\0') |
if (sym_name[0] == '\0') |
2109 |
continue; |
continue; |
2110 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
2111 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
2112 |
addend = get32((uint32_t *)(text + rel->r_offset)); |
addend = get32((uint32_t *)(text + rel->r_offset)); |
2113 |
switch(type) { |
switch(type) { |
2136 |
rel->r_offset < start_offset + copy_size) { |
rel->r_offset < start_offset + copy_size) { |
2137 |
sym = &(symtab[ELFW(R_SYM)(rel->r_info)]); |
sym = &(symtab[ELFW(R_SYM)(rel->r_info)]); |
2138 |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
2139 |
if (strstart(sym_name, "__op_param", &p)) { |
get_reloc_expr(name, sizeof(name), sym_name); |
|
snprintf(name, sizeof(name), "param%s", p); |
|
|
} else { |
|
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
|
|
} |
|
2140 |
type = ELF32_R_TYPE(rel->r_info); |
type = ELF32_R_TYPE(rel->r_info); |
2141 |
addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend; |
addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend; |
2142 |
switch(type) { |
switch(type) { |