diff options
Diffstat (limited to 'tools/lib/bpf/linker.c')
| -rw-r--r-- | tools/lib/bpf/linker.c | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c index f677dccdeae4..9aa016fb55aa 100644 --- a/tools/lib/bpf/linker.c +++ b/tools/lib/bpf/linker.c @@ -210,6 +210,7 @@ void bpf_linker__free(struct bpf_linker *linker)  	}  	free(linker->secs); +	free(linker->glob_syms);  	free(linker);  } @@ -1999,7 +2000,7 @@ add_sym:  static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj)  {  	struct src_sec *src_symtab = &obj->secs[obj->symtab_sec_idx]; -	struct dst_sec *dst_symtab = &linker->secs[linker->symtab_sec_idx]; +	struct dst_sec *dst_symtab;  	int i, err;  	for (i = 1; i < obj->sec_cnt; i++) { @@ -2032,6 +2033,9 @@ static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *ob  			return -1;  		} +		/* add_dst_sec() above could have invalidated linker->secs */ +		dst_symtab = &linker->secs[linker->symtab_sec_idx]; +  		/* shdr->sh_link points to SYMTAB */  		dst_sec->shdr->sh_link = linker->symtab_sec_idx; @@ -2650,6 +2654,7 @@ static int emit_elf_data_sec(struct bpf_linker *linker, const char *sec_name,  static int finalize_btf(struct bpf_linker *linker)  { +	LIBBPF_OPTS(btf_dedup_opts, opts);  	struct btf *btf = linker->btf;  	const void *raw_data;  	int i, j, id, err; @@ -2686,7 +2691,8 @@ static int finalize_btf(struct bpf_linker *linker)  		return err;  	} -	err = btf__dedup(linker->btf, linker->btf_ext, NULL); +	opts.btf_ext = linker->btf_ext; +	err = btf__dedup(linker->btf, &opts);  	if (err) {  		pr_warn("BTF dedup failed: %d\n", err);  		return err; |