| 1564 | } |
| 1565 | |
| 1566 | static int |
| 1567 | link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym, |
| 1568 | linker_symval_t *symval) |
| 1569 | { |
| 1570 | elf_file_t ef; |
| 1571 | const Elf_Sym *es; |
| 1572 | caddr_t val; |
| 1573 | |
| 1574 | ef = (elf_file_t)lf; |
| 1575 | es = (const Elf_Sym *)sym; |
| 1576 | if (es >= ef->symtab && es < (ef->symtab + ef->nchains)) { |
| 1577 | symval->name = ef->strtab + es->st_name; |
| 1578 | val = (caddr_t)ef->address + es->st_value; |
| 1579 | if (ELF_ST_TYPE(es->st_info) == STT_GNU_IFUNC) |
| 1580 | val = ((caddr_t (*)(void))val)(); |
| 1581 | symval->value = val; |
| 1582 | symval->size = es->st_size; |
| 1583 | return (0); |
| 1584 | } |
| 1585 | if (ef->symtab == ef->ddbsymtab) |
| 1586 | return (ENOENT); |
| 1587 | if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) { |
| 1588 | symval->name = ef->ddbstrtab + es->st_name; |
| 1589 | val = (caddr_t)ef->address + es->st_value; |
| 1590 | if (ELF_ST_TYPE(es->st_info) == STT_GNU_IFUNC) |
| 1591 | val = ((caddr_t (*)(void))val)(); |
| 1592 | symval->value = val; |
| 1593 | symval->size = es->st_size; |
| 1594 | return (0); |
| 1595 | } |
| 1596 | return (ENOENT); |
| 1597 | } |
| 1598 | |
| 1599 | static int |
| 1600 | link_elf_search_symbol(linker_file_t lf, caddr_t value, |
no outgoing calls
no test coverage detected