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

Function X_db_search_symbol

freebsd/ddb/db_main.c:107–162  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

105}
106
107c_db_sym_t
108X_db_search_symbol(db_symtab_t *symtab, db_addr_t off, db_strategy_t strat,
109 db_expr_t *diffp)
110{
111 c_linker_sym_t lsym;
112 Elf_Sym *sym, *match;
113 unsigned long diff;
114 db_addr_t stoffs = off;
115
116 if (symtab->private == NULL) {
117 if (!linker_ddb_search_symbol((caddr_t)off, &lsym, &diff)) {
118 *diffp = (db_expr_t)diff;
119 return ((c_db_sym_t)lsym);
120 }
121 return (NULL);
122 }
123 else
124 stoffs -= DB_PRIVATE(symtab)->relbase;
125
126 diff = ~0UL;
127 match = NULL;
128 for (sym = (Elf_Sym*)symtab->start; (char*)sym < symtab->end; sym++) {
129 if (sym->st_name == 0 || sym->st_shndx == SHN_UNDEF)
130 continue;
131 if (stoffs < sym->st_value)
132 continue;
133 if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT &&
134 ELF_ST_TYPE(sym->st_info) != STT_FUNC &&
135 ELF_ST_TYPE(sym->st_info) != STT_NOTYPE)
136 continue;
137 if ((stoffs - sym->st_value) > diff)
138 continue;
139 if ((stoffs - sym->st_value) < diff) {
140 diff = stoffs - sym->st_value;
141 match = sym;
142 } else {
143 if (match == NULL)
144 match = sym;
145 else if (ELF_ST_BIND(match->st_info) == STB_LOCAL &&
146 ELF_ST_BIND(sym->st_info) != STB_LOCAL)
147 match = sym;
148 }
149 if (diff == 0) {
150 if (strat == DB_STGY_PROC &&
151 ELF_ST_TYPE(sym->st_info) == STT_FUNC &&
152 ELF_ST_BIND(sym->st_info) != STB_LOCAL)
153 break;
154 if (strat == DB_STGY_ANY &&
155 ELF_ST_BIND(sym->st_info) != STB_LOCAL)
156 break;
157 }
158 }
159
160 *diffp = (match == NULL) ? off : diff;
161 return ((c_db_sym_t)match);
162}
163
164bool

Callers 1

db_search_symbolFunction · 0.85

Calls 1

linker_ddb_search_symbolFunction · 0.85

Tested by

no test coverage detected