MCPcopy Create free account
hub / github.com/F-Stack/f-stack / relocate_file

Function relocate_file

freebsd/kern/link_elf_obj.c:1267–1351  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1265}
1266
1267static int
1268relocate_file(elf_file_t ef)
1269{
1270 const Elf_Rel *rellim;
1271 const Elf_Rel *rel;
1272 const Elf_Rela *relalim;
1273 const Elf_Rela *rela;
1274 const char *symname;
1275 const Elf_Sym *sym;
1276 int i;
1277 Elf_Size symidx;
1278 Elf_Addr base;
1279
1280 /* Perform relocations without addend if there are any: */
1281 for (i = 0; i < ef->nreltab; i++) {
1282 rel = ef->reltab[i].rel;
1283 if (rel == NULL) {
1284 link_elf_error(ef->lf.filename, "lost a reltab!");
1285 return (ENOEXEC);
1286 }
1287 rellim = rel + ef->reltab[i].nrel;
1288 base = findbase(ef, ef->reltab[i].sec);
1289 if (base == 0) {
1290 link_elf_error(ef->lf.filename, "lost base for reltab");
1291 return (ENOEXEC);
1292 }
1293 for ( ; rel < rellim; rel++) {
1294 symidx = ELF_R_SYM(rel->r_info);
1295 if (symidx >= ef->ddbsymcnt)
1296 continue;
1297 sym = ef->ddbsymtab + symidx;
1298 /* Local relocs are already done */
1299 if (ELF_ST_BIND(sym->st_info) == STB_LOCAL)
1300 continue;
1301 if (elf_reloc(&ef->lf, base, rel, ELF_RELOC_REL,
1302 elf_obj_lookup)) {
1303 symname = symbol_name(ef, rel->r_info);
1304 printf("link_elf_obj: symbol %s undefined\n",
1305 symname);
1306 return (ENOENT);
1307 }
1308 }
1309 }
1310
1311 /* Perform relocations with addend if there are any: */
1312 for (i = 0; i < ef->nrelatab; i++) {
1313 rela = ef->relatab[i].rela;
1314 if (rela == NULL) {
1315 link_elf_error(ef->lf.filename, "lost a relatab!");
1316 return (ENOEXEC);
1317 }
1318 relalim = rela + ef->relatab[i].nrela;
1319 base = findbase(ef, ef->relatab[i].sec);
1320 if (base == 0) {
1321 link_elf_error(ef->lf.filename,
1322 "lost base for relatab");
1323 return (ENOEXEC);
1324 }

Callers 2

link_elf_load_fileFunction · 0.70

Calls 6

findbaseFunction · 0.85
link_elf_errorFunction · 0.70
symbol_nameFunction · 0.70
printfFunction · 0.70
elf_relocFunction · 0.50

Tested by

no test coverage detected