tools/bpf/bpftool/gen.c
1939
struct bpf_linker *linker;
tools/bpf/bpftool/gen.c
1950
linker = bpf_linker__new(output_file, NULL);
tools/bpf/bpftool/gen.c
1951
if (!linker) {
tools/bpf/bpftool/gen.c
1959
err = bpf_linker__add_file(linker, file, NULL);
tools/bpf/bpftool/gen.c
1966
err = bpf_linker__finalize(linker);
tools/bpf/bpftool/gen.c
1974
bpf_linker__free(linker);
tools/lib/bpf/linker.c
1140
static int init_sec(struct bpf_linker *linker, struct dst_sec *dst_sec, struct src_sec *src_sec)
tools/lib/bpf/linker.c
1155
scn = elf_newscn(linker->elf);
tools/lib/bpf/linker.c
1170
name_off = strset__add_str(linker->strtab_strs, src_sec->sec_name);
tools/lib/bpf/linker.c
1196
static struct dst_sec *find_dst_sec_by_name(struct bpf_linker *linker, const char *sec_name)
tools/lib/bpf/linker.c
1201
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
1202
sec = &linker->secs[i];
tools/lib/bpf/linker.c
1259
static int extend_sec(struct bpf_linker *linker, struct dst_sec *dst, struct src_sec *src)
tools/lib/bpf/linker.c
1279
err = init_sec(linker, dst, src);
tools/lib/bpf/linker.c
1320
if (linker->swapped_endian && is_exec_sec(dst))
tools/lib/bpf/linker.c
1353
static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj)
tools/lib/bpf/linker.c
1365
dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name);
tools/lib/bpf/linker.c
1367
dst_sec = add_dst_sec(linker, src_sec->sec_name);
tools/lib/bpf/linker.c
1370
err = init_sec(linker, dst_sec, src_sec);
tools/lib/bpf/linker.c
1397
err = extend_sec(linker, dst_sec, src_sec);
tools/lib/bpf/linker.c
1405
static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj)
tools/lib/bpf/linker.c
1430
err = linker_append_elf_sym(linker, obj, sym, sym_name, i);
tools/lib/bpf/linker.c
1438
static Elf64_Sym *get_sym_by_idx(struct bpf_linker *linker, size_t sym_idx)
tools/lib/bpf/linker.c
1440
struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx];
tools/lib/bpf/linker.c
1446
static struct glob_sym *find_glob_sym(struct bpf_linker *linker, const char *sym_name)
tools/lib/bpf/linker.c
1452
for (i = 0; i < linker->glob_sym_cnt; i++) {
tools/lib/bpf/linker.c
1453
glob_sym = &linker->glob_syms[i];
tools/lib/bpf/linker.c
1454
name = strset__data(linker->strtab_strs) + glob_sym->name_off;
tools/lib/bpf/linker.c
1463
static struct glob_sym *add_glob_sym(struct bpf_linker *linker)
tools/lib/bpf/linker.c
1467
syms = libbpf_reallocarray(linker->glob_syms, linker->glob_sym_cnt + 1,
tools/lib/bpf/linker.c
1468
sizeof(*linker->glob_syms));
tools/lib/bpf/linker.c
1472
sym = &syms[linker->glob_sym_cnt];
tools/lib/bpf/linker.c
1476
linker->glob_syms = syms;
tools/lib/bpf/linker.c
1477
linker->glob_sym_cnt++;
tools/lib/bpf/linker.c
166
static int init_output_elf(struct bpf_linker *linker);
tools/lib/bpf/linker.c
168
static int bpf_linker_add_file(struct bpf_linker *linker, int fd,
tools/lib/bpf/linker.c
171
static int linker_load_obj_file(struct bpf_linker *linker,
tools/lib/bpf/linker.c
1765
struct bpf_linker *linker, struct glob_sym *glob_sym,
tools/lib/bpf/linker.c
1787
t = btf__type_by_id(linker->btf, glob_sym->btf_id);
tools/lib/bpf/linker.c
1788
t = skip_mods_and_typedefs(linker->btf, t->type, NULL);
tools/lib/bpf/linker.c
1789
err = parse_btf_map_def(sym_name, linker->btf, t, true /*strict*/, &dst_def, &dst_inner_def);
tools/lib/bpf/linker.c
179
static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj);
tools/lib/bpf/linker.c
180
static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj);
tools/lib/bpf/linker.c
1800
return map_defs_match(sym_name, linker->btf, &dst_def, &dst_inner_def,
tools/lib/bpf/linker.c
1805
struct bpf_linker *linker, struct glob_sym *glob_sym,
tools/lib/bpf/linker.c
181
static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj,
tools/lib/bpf/linker.c
1826
if (glob_sym->sec_id && strcmp(linker->secs[glob_sym->sec_id].sec_name, MAPS_ELF_SEC) == 0)
tools/lib/bpf/linker.c
1827
return glob_map_defs_match(sym_name, linker, glob_sym, obj, sym, btf_id);
tools/lib/bpf/linker.c
183
static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj);
tools/lib/bpf/linker.c
1830
linker->btf, glob_sym->btf_id, obj->btf, btf_id))
tools/lib/bpf/linker.c
184
static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj);
tools/lib/bpf/linker.c
185
static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj);
tools/lib/bpf/linker.c
187
static int finalize_btf(struct bpf_linker *linker);
tools/lib/bpf/linker.c
188
static int finalize_btf_ext(struct bpf_linker *linker);
tools/lib/bpf/linker.c
190
void bpf_linker__free(struct bpf_linker *linker)
tools/lib/bpf/linker.c
194
if (!linker)
tools/lib/bpf/linker.c
197
free(linker->filename);
tools/lib/bpf/linker.c
199
if (linker->elf)
tools/lib/bpf/linker.c
1995
static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj,
tools/lib/bpf/linker.c
200
elf_end(linker->elf);
tools/lib/bpf/linker.c
202
if (linker->fd >= 0 && linker->fd_is_owned)
tools/lib/bpf/linker.c
2021
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
203
close(linker->fd);
tools/lib/bpf/linker.c
205
strset__free(linker->strtab_strs);
tools/lib/bpf/linker.c
2060
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
2064
glob_sym = find_glob_sym(linker, sym_name);
tools/lib/bpf/linker.c
207
btf__free(linker->btf);
tools/lib/bpf/linker.c
208
btf_ext__free(linker->btf_ext);
tools/lib/bpf/linker.c
2083
if (!glob_syms_match(sym_name, linker, glob_sym, obj, sym, src_sym_idx, btf_id))
tools/lib/bpf/linker.c
2086
dst_sym = get_sym_by_idx(linker, glob_sym->sym_idx);
tools/lib/bpf/linker.c
210
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
211
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
2139
if (complete_extern_btf_info(linker->btf, glob_sym->btf_id,
tools/lib/bpf/linker.c
2151
name_off = strset__add_str(linker->strtab_strs, sym_name);
tools/lib/bpf/linker.c
2155
dst_sym = add_new_sym(linker, &dst_sym_idx);
tools/lib/bpf/linker.c
2174
glob_sym = add_glob_sym(linker);
tools/lib/bpf/linker.c
2196
static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj)
tools/lib/bpf/linker.c
221
free(linker->secs);
tools/lib/bpf/linker.c
2216
dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name);
tools/lib/bpf/linker.c
2218
dst_sec = add_dst_sec(linker, src_sec->sec_name);
tools/lib/bpf/linker.c
2221
err = init_sec(linker, dst_sec, src_sec);
tools/lib/bpf/linker.c
223
free(linker->glob_syms);
tools/lib/bpf/linker.c
2232
dst_sec->shdr->sh_link = linker->symtab_sec_idx;
tools/lib/bpf/linker.c
2235
dst_linked_sec = &linker->secs[src_linked_sec->dst_id];
tools/lib/bpf/linker.c
2239
err = extend_sec(linker, dst_sec, src_sec);
tools/lib/bpf/linker.c
224
free(linker);
tools/lib/bpf/linker.c
229
struct bpf_linker *linker;
tools/lib/bpf/linker.c
240
linker = calloc(1, sizeof(*linker));
tools/lib/bpf/linker.c
241
if (!linker)
tools/lib/bpf/linker.c
2412
static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj)
tools/lib/bpf/linker.c
2421
start_id = btf__type_cnt(linker->btf);
tools/lib/bpf/linker.c
244
linker->filename = strdup(filename);
tools/lib/bpf/linker.c
2440
glob_sym = find_glob_sym(linker, name);
tools/lib/bpf/linker.c
245
if (!linker->filename) {
tools/lib/bpf/linker.c
2467
id = btf__add_type(linker->btf, obj->btf, t);
tools/lib/bpf/linker.c
2483
n = btf__type_cnt(linker->btf);
tools/lib/bpf/linker.c
2485
struct btf_type *dst_t = btf_type_by_id(linker->btf, i);
tools/lib/bpf/linker.c
250
linker->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644);
tools/lib/bpf/linker.c
251
if (linker->fd < 0) {
tools/lib/bpf/linker.c
2510
for (i = 0; i < linker->glob_sym_cnt; i++) {
tools/lib/bpf/linker.c
2511
struct glob_sym *glob_sym = &linker->glob_syms[i];
tools/lib/bpf/linker.c
2519
glob_t = btf_type_by_id(linker->btf, glob_sym->btf_id);
tools/lib/bpf/linker.c
2533
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
2553
t = btf_type_by_id(linker->btf, new_id);
tools/lib/bpf/linker.c
2555
name = btf__str_by_offset(linker->btf, t->name_off);
tools/lib/bpf/linker.c
2556
glob_sym = find_glob_sym(linker, name);
tools/lib/bpf/linker.c
256
linker->fd_is_owned = true;
tools/lib/bpf/linker.c
258
err = init_output_elf(linker);
tools/lib/bpf/linker.c
2581
sz = btf__resolve_size(linker->btf, glob_sym->underlying_btf_id);
tools/lib/bpf/linker.c
262
return linker;
tools/lib/bpf/linker.c
2630
static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj)
tools/lib/bpf/linker.c
265
bpf_linker__free(linker);
tools/lib/bpf/linker.c
2651
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
2680
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
2697
str_off = btf__add_str(linker->btf, s);
tools/lib/bpf/linker.c
2703
str_off = btf__add_str(linker->btf, s);
tools/lib/bpf/linker.c
271
struct bpf_linker *linker;
tools/lib/bpf/linker.c
2722
dst_sec = &linker->secs[src_sec->dst_id];
tools/lib/bpf/linker.c
2740
str_off = btf__add_str(linker->btf, s);
tools/lib/bpf/linker.c
2752
int bpf_linker__finalize(struct bpf_linker *linker)
tools/lib/bpf/linker.c
2759
if (!linker->elf)
tools/lib/bpf/linker.c
2762
err = finalize_btf(linker);
tools/lib/bpf/linker.c
2767
strs_sz = strset__data_size(linker->strtab_strs);
tools/lib/bpf/linker.c
2768
strs = strset__data(linker->strtab_strs);
tools/lib/bpf/linker.c
2770
sec = &linker->secs[linker->strtab_sec_idx];
tools/lib/bpf/linker.c
2778
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
2779
sec = &linker->secs[i];
tools/lib/bpf/linker.c
2782
if (sec->sec_idx == linker->strtab_sec_idx)
tools/lib/bpf/linker.c
2790
if (linker->swapped_endian && is_exec_sec(sec))
tools/lib/bpf/linker.c
2797
if (elf_update(linker->elf, ELF_C_NULL) < 0) {
tools/lib/bpf/linker.c
2804
if (elf_update(linker->elf, ELF_C_WRITE) < 0) {
tools/lib/bpf/linker.c
2810
elf_end(linker->elf);
tools/lib/bpf/linker.c
2811
linker->elf = NULL;
tools/lib/bpf/linker.c
2813
if (linker->fd_is_owned)
tools/lib/bpf/linker.c
2814
close(linker->fd);
tools/lib/bpf/linker.c
2815
linker->fd = -1;
tools/lib/bpf/linker.c
2820
static int emit_elf_data_sec(struct bpf_linker *linker, const char *sec_name,
tools/lib/bpf/linker.c
2828
name_off = strset__add_str(linker->strtab_strs, sec_name);
tools/lib/bpf/linker.c
2832
scn = elf_newscn(linker->elf);
tools/lib/bpf/linker.c
286
linker = calloc(1, sizeof(*linker));
tools/lib/bpf/linker.c
2860
static int finalize_btf(struct bpf_linker *linker)
tools/lib/bpf/linker.c
2864
struct btf *btf = linker->btf;
tools/lib/bpf/linker.c
287
if (!linker)
tools/lib/bpf/linker.c
2870
if (btf__type_cnt(linker->btf) == 1)
tools/lib/bpf/linker.c
2873
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
2874
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
2894
err = finalize_btf_ext(linker);
tools/lib/bpf/linker.c
2900
opts.btf_ext = linker->btf_ext;
tools/lib/bpf/linker.c
2901
err = btf__dedup(linker->btf, &opts);
tools/lib/bpf/linker.c
2908
link_endianness = linker->elf_hdr->e_ident[EI_DATA] == ELFDATA2MSB ?
tools/lib/bpf/linker.c
291
linker->filename = strdup(filename);
tools/lib/bpf/linker.c
2910
btf__set_endianness(linker->btf, link_endianness);
tools/lib/bpf/linker.c
2911
if (linker->btf_ext)
tools/lib/bpf/linker.c
2912
btf_ext__set_endianness(linker->btf_ext, link_endianness);
tools/lib/bpf/linker.c
2915
raw_data = btf__raw_data(linker->btf, &raw_sz);
tools/lib/bpf/linker.c
2919
err = emit_elf_data_sec(linker, BTF_ELF_SEC, 8, raw_data, raw_sz);
tools/lib/bpf/linker.c
292
if (!linker->filename) {
tools/lib/bpf/linker.c
2926
if (linker->btf_ext) {
tools/lib/bpf/linker.c
2927
raw_data = btf_ext__raw_data(linker->btf_ext, &raw_sz);
tools/lib/bpf/linker.c
2931
err = emit_elf_data_sec(linker, BTF_EXT_ELF_SEC, 8, raw_data, raw_sz);
tools/lib/bpf/linker.c
2941
static int emit_btf_ext_data(struct bpf_linker *linker, void *output,
tools/lib/bpf/linker.c
2952
str_off = btf__add_str(linker->btf, sec_name);
tools/lib/bpf/linker.c
2968
static int finalize_btf_ext(struct bpf_linker *linker)
tools/lib/bpf/linker.c
297
linker->fd = fd;
tools/lib/bpf/linker.c
298
linker->fd_is_owned = false;
tools/lib/bpf/linker.c
2980
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
2981
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
300
err = init_output_elf(linker);
tools/lib/bpf/linker.c
304
return linker;
tools/lib/bpf/linker.c
3058
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
3059
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
3061
sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->func_info);
tools/lib/bpf/linker.c
307
bpf_linker__free(linker);
tools/lib/bpf/linker.c
3075
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
3076
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
3078
sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->line_info);
tools/lib/bpf/linker.c
3092
for (i = 1; i < linker->sec_cnt; i++) {
tools/lib/bpf/linker.c
3093
struct dst_sec *sec = &linker->secs[i];
tools/lib/bpf/linker.c
3095
sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->core_relo_info);
tools/lib/bpf/linker.c
3105
linker->btf_ext = btf_ext__new(data, total_sz);
tools/lib/bpf/linker.c
3106
err = libbpf_get_error(linker->btf_ext);
tools/lib/bpf/linker.c
3108
linker->btf_ext = NULL;
tools/lib/bpf/linker.c
311
static struct dst_sec *add_dst_sec(struct bpf_linker *linker, const char *sec_name)
tools/lib/bpf/linker.c
313
struct dst_sec *secs = linker->secs, *sec;
tools/lib/bpf/linker.c
314
size_t new_cnt = linker->sec_cnt ? linker->sec_cnt + 1 : 2;
tools/lib/bpf/linker.c
321
memset(secs + linker->sec_cnt, 0, (new_cnt - linker->sec_cnt) * sizeof(*secs));
tools/lib/bpf/linker.c
323
linker->secs = secs;
tools/lib/bpf/linker.c
324
linker->sec_cnt = new_cnt;
tools/lib/bpf/linker.c
326
sec = &linker->secs[new_cnt - 1];
tools/lib/bpf/linker.c
335
static Elf64_Sym *add_new_sym(struct bpf_linker *linker, size_t *sym_idx)
tools/lib/bpf/linker.c
337
struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx];
tools/lib/bpf/linker.c
359
static int init_output_elf(struct bpf_linker *linker)
tools/lib/bpf/linker.c
365
linker->elf = elf_begin(linker->fd, ELF_C_WRITE, NULL);
tools/lib/bpf/linker.c
366
if (!linker->elf) {
tools/lib/bpf/linker.c
372
linker->elf_hdr = elf64_newehdr(linker->elf);
tools/lib/bpf/linker.c
373
if (!linker->elf_hdr) {
tools/lib/bpf/linker.c
378
linker->elf_hdr->e_machine = EM_BPF;
tools/lib/bpf/linker.c
379
linker->elf_hdr->e_type = ET_REL;
tools/lib/bpf/linker.c
381
linker->elf_hdr->e_ident[EI_DATA] = ELFDATANONE;
tools/lib/bpf/linker.c
385
linker->strtab_strs = strset__new(INT_MAX, "", sizeof(""));
tools/lib/bpf/linker.c
386
if (libbpf_get_error(linker->strtab_strs))
tools/lib/bpf/linker.c
387
return libbpf_get_error(linker->strtab_strs);
tools/lib/bpf/linker.c
389
sec = add_dst_sec(linker, ".strtab");
tools/lib/bpf/linker.c
393
sec->scn = elf_newscn(linker->elf);
tools/lib/bpf/linker.c
409
str_off = strset__add_str(linker->strtab_strs, sec->sec_name);
tools/lib/bpf/linker.c
414
linker->elf_hdr->e_shstrndx = sec->sec_idx;
tools/lib/bpf/linker.c
415
linker->strtab_sec_idx = sec->sec_idx;
tools/lib/bpf/linker.c
428
sec = add_dst_sec(linker, ".symtab");
tools/lib/bpf/linker.c
432
sec->scn = elf_newscn(linker->elf);
tools/lib/bpf/linker.c
450
str_off = strset__add_str(linker->strtab_strs, sec->sec_name);
tools/lib/bpf/linker.c
455
linker->symtab_sec_idx = sec->sec_idx;
tools/lib/bpf/linker.c
461
sec->shdr->sh_link = linker->strtab_sec_idx;
tools/lib/bpf/linker.c
470
linker->btf = btf__new_empty();
tools/lib/bpf/linker.c
471
err = libbpf_get_error(linker->btf);
tools/lib/bpf/linker.c
476
init_sym = add_new_sym(linker, NULL);
tools/lib/bpf/linker.c
490
static int bpf_linker_add_file(struct bpf_linker *linker, int fd,
tools/lib/bpf/linker.c
499
err = err ?: linker_load_obj_file(linker, &obj);
tools/lib/bpf/linker.c
500
err = err ?: linker_append_sec_data(linker, &obj);
tools/lib/bpf/linker.c
501
err = err ?: linker_append_elf_syms(linker, &obj);
tools/lib/bpf/linker.c
502
err = err ?: linker_append_elf_relos(linker, &obj);
tools/lib/bpf/linker.c
503
err = err ?: linker_append_btf(linker, &obj);
tools/lib/bpf/linker.c
504
err = err ?: linker_append_btf_ext(linker, &obj);
tools/lib/bpf/linker.c
518
int bpf_linker__add_file(struct bpf_linker *linker, const char *filename,
tools/lib/bpf/linker.c
526
if (!linker->elf)
tools/lib/bpf/linker.c
536
err = bpf_linker_add_file(linker, fd, filename);
tools/lib/bpf/linker.c
541
int bpf_linker__add_fd(struct bpf_linker *linker, int fd,
tools/lib/bpf/linker.c
550
if (!linker->elf)
tools/lib/bpf/linker.c
557
err = bpf_linker_add_file(linker, fd, filename);
tools/lib/bpf/linker.c
561
int bpf_linker__add_buf(struct bpf_linker *linker, void *buf, size_t buf_sz,
tools/lib/bpf/linker.c
570
if (!linker->elf)
tools/lib/bpf/linker.c
593
ret = bpf_linker_add_file(linker, fd, filename);
tools/lib/bpf/linker.c
664
static int linker_load_obj_file(struct bpf_linker *linker,
tools/lib/bpf/linker.c
674
unsigned char link_byteorder = linker->elf_hdr->e_ident[EI_DATA];
tools/lib/bpf/linker.c
706
linker->elf_hdr->e_ident[EI_DATA] = obj_byteorder;
tools/lib/bpf/linker.c
707
linker->swapped_endian = obj_byteorder != host_byteorder;