| 1265 | } |
| 1266 | |
| 1267 | static int |
| 1268 | relocate_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 | } |
no test coverage detected