Skip to content

Commit

Permalink
libbpf: Support initialized global variables
Browse files Browse the repository at this point in the history
Initialized global variables are no different in ELF from static variables,
and don't require any extra support from libbpf. But they are matching
semantics of global data (backed by BPF maps) more closely, preventing
LLVM/Clang from aggressively inlining constant values and not requiring
volatile incantations to prevent those. This patch enables global variables.
It still disables uninitialized variables, which will be put into special COM
(common) ELF section, because BPF doesn't allow uninitialized data to be
accessed.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20191121070743.1309473-5-andriin@fb.com
  • Loading branch information
Andrii Nakryiko authored and Alexei Starovoitov committed Nov 25, 2019
1 parent 8983b73 commit 393cdfb
Show file tree
Hide file tree
Showing 14 changed files with 28 additions and 33 deletions.
9 changes: 2 additions & 7 deletions tools/lib/bpf/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1835,8 +1835,8 @@ static int bpf_program__record_reloc(struct bpf_program *prog,
return -LIBBPF_ERRNO__RELOC;
}
if (!shdr_idx || shdr_idx >= SHN_LORESERVE) {
pr_warn("relocation: not yet supported relo for non-static global \'%s\' variable in special section (0x%x) found in insns[%d].code 0x%x\n",
name, shdr_idx, insn_idx, insn->code);
pr_warn("invalid relo for \'%s\' in special section 0x%x; forgot to initialize global var?..\n",
name, shdr_idx);
return -LIBBPF_ERRNO__RELOC;
}

Expand Down Expand Up @@ -1876,11 +1876,6 @@ static int bpf_program__record_reloc(struct bpf_program *prog,
pr_warn("bad data relo against section %u\n", shdr_idx);
return -LIBBPF_ERRNO__RELOC;
}
if (GELF_ST_BIND(sym->st_info) == STB_GLOBAL) {
pr_warn("relocation: not yet supported relo for non-static global \'%s\' variable found in insns[%d].code 0x%x\n",
name, insn_idx, insn->code);
return -LIBBPF_ERRNO__RELOC;
}
if (!obj->caps.global_data) {
pr_warn("relocation: kernel does not support global \'%s\' variable access in insns[%d]\n",
name, insn_idx);
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_arrays.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_arrays_output {
int a2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_bitfields {
/* unsigned bitfields */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_bitfields {
/* unsigned bitfields */
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_existence.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_existence_output {
int a_exists;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_flavors.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_flavors {
int a;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_ints.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_ints {
uint8_t u8_field;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_kernel_output {
int valid[10];
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_misc_output {
int a, b, c;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_mods.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_mods_output {
int a, b, c, d, e, f, g, h;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_nesting.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_nesting_substruct {
int a;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

enum core_reloc_primitives_enum {
A = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_ptr_as_arr {
int a;
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/bpf/progs/test_core_reloc_size.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

char _license[] SEC("license") = "GPL";

static volatile struct data {
struct {
char in[256];
char out[256];
} data;
} data = {};

struct core_reloc_size_output {
int int_sz;
Expand Down

0 comments on commit 393cdfb

Please sign in to comment.