glob_sym
static struct glob_sym *find_glob_sym(struct bpf_linker *linker, const char *sym_name)
struct glob_sym *glob_sym;
glob_sym = &linker->glob_syms[i];
name = strset__data(linker->strtab_strs) + glob_sym->name_off;
return glob_sym;
static struct glob_sym *add_glob_sym(struct bpf_linker *linker)
struct glob_sym *syms, *sym;
struct glob_sym *glob_syms;
struct bpf_linker *linker, struct glob_sym *glob_sym,
t = btf__type_by_id(linker->btf, glob_sym->btf_id);
struct bpf_linker *linker, struct glob_sym *glob_sym,
if (!glob_sym->btf_id || !btf_id) {
if (glob_sym->sec_id && strcmp(linker->secs[glob_sym->sec_id].sec_name, MAPS_ELF_SEC) == 0)
return glob_map_defs_match(sym_name, linker, glob_sym, obj, sym, btf_id);
linker->btf, glob_sym->btf_id, obj->btf, btf_id))
struct glob_sym *glob_sym = NULL;
glob_sym = find_glob_sym(linker, sym_name);
if (glob_sym) {
obj->sym_map[src_sym_idx] = glob_sym->sym_idx;
if (!sym_is_extern && !glob_sym->is_extern
&& !glob_sym->is_weak && sym_bind != STB_WEAK) {
if (!glob_syms_match(sym_name, linker, glob_sym, obj, sym, src_sym_idx, btf_id))
dst_sym = get_sym_by_idx(linker, glob_sym->sym_idx);
glob_sym->is_weak = false;
if (!glob_sym->is_extern && sym_bind == STB_WEAK)
glob_sym->sec_id = dst_sec->id;
glob_sym->is_extern = false;
if (complete_extern_btf_info(linker->btf, glob_sym->btf_id,
glob_sym->underlying_btf_id = 0;
obj->sym_map[src_sym_idx] = glob_sym->sym_idx;
glob_sym = add_glob_sym(linker);
if (!glob_sym)
glob_sym->sym_idx = dst_sym_idx;
glob_sym->sec_id = dst_sec ? dst_sec->id : 0;
glob_sym->name_off = name_off;
glob_sym->btf_id = 0;
glob_sym->is_extern = sym_is_extern;
glob_sym->is_weak = sym_bind == STB_WEAK;
struct glob_sym *glob_sym = NULL;
glob_sym = find_glob_sym(linker, name);
if (!glob_sym)
if (glob_sym->underlying_btf_id == 0)
glob_sym->underlying_btf_id = -t->type;
if (glob_sym->btf_id) {
obj->btf_type_map[i] = glob_sym->btf_id;
if (glob_sym) {
glob_sym->btf_id = id;
glob_sym->underlying_btf_id = -t->type;
struct glob_sym *glob_sym = &linker->glob_syms[i];
if (glob_sym->underlying_btf_id >= 0)
glob_sym->underlying_btf_id = obj->btf_type_map[-glob_sym->underlying_btf_id];
glob_t = btf_type_by_id(linker->btf, glob_sym->btf_id);
glob_t->type = glob_sym->underlying_btf_id;
struct glob_sym *glob_sym = NULL;
glob_sym = find_glob_sym(linker, name);
if (glob_sym->sec_id != dst_sec->id) {
name, glob_sym->sec_id, dst_sec->id);
if (glob_sym && glob_sym->var_idx >= 0) {
dst_var = &dst_sec->sec_vars[glob_sym->var_idx];
sz = btf__resolve_size(linker->btf, glob_sym->underlying_btf_id);
if (glob_sym)
glob_sym->var_idx = dst_sec->sec_var_cnt - 1;