Skip to contentSkip to conversation

bpf: check map symbol type properly with newer llvm compiler

PATCH In review Yonghong Song 3 participants 3 messages Oct 30, 2018 – Nov 1, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 bpf: check map symbol type properly with newer llvm compiler

With llvm 7.0 or earlier, the map symbol type is STT_NOTYPE.
-bash-4.4$ cat t.c __attribute__((section("maps"))) int g; -bash-4.4$ clang -target bpf -O2 -c t.c -bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 2 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    3 g

-bash-4.4$

The following llvm commit enables BPF target to generate proper symbol type and size.
commit bf6ec206615b9718869d48b4e5400d0c6e3638dd
Author: Yonghong Song <[email protected]>
Date: Wed Sep 19 16:04:13 2018 +0000

[bpf] Symbol sizes and types in object file

Clang-compiled object files currently don't include the symbol sizes and types. Some tools however need that information. For example, ctfconvert uses that information to generate FreeBSD's CTF representation from ELF files.
With this patch, symbol sizes and types are included in object files.

Hence, for llvm 8.0.0 (currently trunk), symbol type will be not NOTYPE, but OBJECT.
-bash-4.4$ clang -target bpf -O2 -c t.c
-bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 3 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS t.c
       2: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g

-bash-4.4$

This patch makes sure bpf library accepts both NOTYPE and OBJECT types of global map symbols.

---
 lib/bpf.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)
lib/bpf.c +9 -3
index d093d0bd..45f279fa 100644
@@ -1758,11 +1758,13 @@ static const char *bpf_map_fetch_name(struct bpf_elf_ctx *ctx, int which)
 	int i;
 
 	for (i = 0; i < ctx->sym_num; i++) {
+		int type = GELF_ST_TYPE(sym.st_info);
+
 		if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
 			continue;
 
 		if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
-		    GELF_ST_TYPE(sym.st_info) != STT_NOTYPE ||
+		    (type != STT_NOTYPE && type != STT_OBJECT) ||
 		    sym.st_shndx != ctx->sec_maps ||
 		    sym.st_value / ctx->map_len != which)
 			continue;
@@ -1849,11 +1851,13 @@ static int bpf_map_num_sym(struct bpf_elf_ctx *ctx)
 	GElf_Sym sym;
 
 	for (i = 0; i < ctx->sym_num; i++) {
+		int type = GELF_ST_TYPE(sym.st_info);
+
 		if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
 			continue;
 
 		if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
-		    GELF_ST_TYPE(sym.st_info) != STT_NOTYPE ||
+		    (type != STT_NOTYPE && type != STT_OBJECT) ||
 		    sym.st_shndx != ctx->sec_maps)
 			continue;
 		num++;
@@ -1927,10 +1931,12 @@ static int bpf_map_verify_all_offs(struct bpf_elf_ctx *ctx, int end)
 		 * the table again.
 		 */
 		for (i = 0; i < ctx->sym_num; i++) {
+			int type = GELF_ST_TYPE(sym.st_info);
+
 			if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
 				continue;
 			if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
-			    GELF_ST_TYPE(sym.st_info) != STT_NOTYPE ||
+			    (type != STT_NOTYPE && type != STT_OBJECT) ||
 			    sym.st_shndx != ctx->sec_maps)
 				continue;
 			if (sym.st_value == off)
Signature · 1 line
2.17.1
Acked-by on v1 1/1
#1 lore raw
Quoted 38 lines · Yonghong Song

With llvm 7.0 or earlier, the map symbol type is STT_NOTYPE.
-bash-4.4$ cat t.c __attribute__((section("maps"))) int g; -bash-4.4$ clang -target bpf -O2 -c t.c -bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 2 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    3 g

-bash-4.4$

The following llvm commit enables BPF target to generate proper symbol type and size.
commit bf6ec206615b9718869d48b4e5400d0c6e3638dd
Author: Yonghong Song <[email protected]>
Date: Wed Sep 19 16:04:13 2018 +0000

[bpf] Symbol sizes and types in object file

Clang-compiled object files currently don't include the symbol sizes and types. Some tools however need that information. For example, ctfconvert uses that information to generate FreeBSD's CTF representation from ELF files.
With this patch, symbol sizes and types are included in object files.

Hence, for llvm 8.0.0 (currently trunk), symbol type will be not NOTYPE, but OBJECT.
-bash-4.4$ clang -target bpf -O2 -c t.c
-bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 3 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS t.c
       2: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g
Quoted 6 lines

-bash-4.4$

This patch makes sure bpf library accepts both NOTYPE and OBJECT types of global map symbols.

Thanks!

#2 lore raw
In reply to Yonghong Song
Quoted 38 lines · On Mon, 29 Oct 2018 15:32:03 -0700 Yonghong Song <[email protected]> wrote:

With llvm 7.0 or earlier, the map symbol type is STT_NOTYPE.
-bash-4.4$ cat t.c __attribute__((section("maps"))) int g; -bash-4.4$ clang -target bpf -O2 -c t.c -bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 2 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    3 g

-bash-4.4$

The following llvm commit enables BPF target to generate proper symbol type and size.
commit bf6ec206615b9718869d48b4e5400d0c6e3638dd
Author: Yonghong Song <[email protected]>
Date: Wed Sep 19 16:04:13 2018 +0000

[bpf] Symbol sizes and types in object file

Clang-compiled object files currently don't include the symbol sizes and types. Some tools however need that information. For example, ctfconvert uses that information to generate FreeBSD's CTF representation from ELF files.
With this patch, symbol sizes and types are included in object files.

Hence, for llvm 8.0.0 (currently trunk), symbol type will be not NOTYPE, but OBJECT.
-bash-4.4$ clang -target bpf -O2 -c t.c
-bash-4.4$ readelf -s t.o

Symbol table '.symtab' contains 3 entries:

     Num:    Value          Size Type    Bind   Vis      Ndx Name
       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
       1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS t.c
       2: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g
Quoted 6 lines

-bash-4.4$

This patch makes sure bpf library accepts both NOTYPE and OBJECT types of global map symbols.

Looks good, applied.