kernel_optimize_test/tools/objtool
Peter Zijlstra e1db6c8a69 objtool: Fix symbol creation
commit ead165fa1042247b033afad7be4be9b815d04ade upstream.

Nathan reported objtool failing with the following messages:

  warning: objtool: no non-local symbols !?
  warning: objtool: gelf_update_symshndx: invalid section index

The problem is due to commit 4abff6d48dbc ("objtool: Fix code relocs
vs weak symbols") failing to consider the case where an object would
have no non-local symbols.

The problem that commit tries to address is adding a STB_LOCAL symbol
to the symbol table in light of the ELF spec's requirement that:

  In each symbol table, all symbols with STB_LOCAL binding preced the
  weak and global symbols.  As ``Sections'' above describes, a symbol
  table section's sh_info section header member holds the symbol table
  index for the first non-local symbol.

The approach taken is to find this first non-local symbol, move that
to the end and then re-use the freed spot to insert a new local symbol
and increment sh_info.

Except it never considered the case of object files without global
symbols and got a whole bunch of details wrong -- so many in fact that
it is a wonder it ever worked :/

Specifically:

 - It failed to re-hash the symbol on the new index, so a subsequent
   find_symbol_by_index() would not find it at the new location and a
   query for the old location would now return a non-deterministic
   choice between the old and new symbol.

 - It failed to appreciate that the GElf wrappers are not a valid disk
   format (it works because GElf is basically Elf64 and we only
   support x86_64 atm.)

 - It failed to fully appreciate how horrible the libelf API really is
   and got the gelf_update_symshndx() call pretty much completely
   wrong; with the direct consequence that if inserting a second
   STB_LOCAL symbol would require moving the same STB_GLOBAL symbol
   again it would completely come unstuck.

Write a new elf_update_symbol() function that wraps all the magic
required to update or create a new symbol at a given index.

Specifically, gelf_update_sym*() require an @ndx argument that is
relative to the @data argument; this means you have to manually
iterate the section data descriptor list and update @ndx.

Fixes: 4abff6d48dbc ("objtool: Fix code relocs vs weak symbols")
Reported-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Josh Poimboeuf <jpoimboe@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Cc: <stable@vger.kernel.org>
Link: https://lkml.kernel.org/r/YoPCTEYjoPqE4ZxB@hirez.programming.kicks-ass.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[bwh: Backported to 5.10: elf_hash_add() takes a hash table pointer,
 not just a name]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-07-25 11:26:33 +02:00
..
arch/x86 objtool: Add straight-line-speculation validation 2022-07-25 11:26:30 +02:00
Documentation objtool: Support stack layout changes in alternatives 2022-07-25 11:26:06 +02:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
arch.h objtool: Add straight-line-speculation validation 2022-07-25 11:26:30 +02:00
Build objtool: Enable compilation of objtool for all architectures 2020-05-20 09:17:28 -05:00
builtin-check.c objtool: Add straight-line-speculation validation 2022-07-25 11:26:30 +02:00
builtin-orc.c objtool: Refactor ORC section generation 2022-07-25 11:26:05 +02:00
builtin.h objtool: Add straight-line-speculation validation 2022-07-25 11:26:30 +02:00
cfi.h objtool: Introduce CFI hash 2022-07-25 11:26:22 +02:00
check.c objtool: Fix type of reloc::addend 2022-07-25 11:26:32 +02:00
check.h objtool: Introduce CFI hash 2022-07-25 11:26:22 +02:00
elf.c objtool: Fix symbol creation 2022-07-25 11:26:33 +02:00
elf.h objtool: Fix type of reloc::addend 2022-07-25 11:26:32 +02:00
Makefile objtool: Refactor ORC section generation 2022-07-25 11:26:05 +02:00
objtool.c objtool: Keep track of retpoline call sites 2022-07-25 11:26:17 +02:00
objtool.h objtool: Keep track of retpoline call sites 2022-07-25 11:26:17 +02:00
orc_dump.c objtool: Make unwind hint definitions available to other architectures 2020-09-10 10:43:13 -05:00
orc_gen.c objtool: Introduce CFI hash 2022-07-25 11:26:22 +02:00
special.c objtool,x86: Replace alternatives with .retpoline_sites 2022-07-25 11:26:23 +02:00
special.h objtool: Refactor jump table code to support other architectures 2020-09-10 10:43:13 -05:00
sync-check.sh x86/insn: Add a __ignore_sync_check__ marker 2022-07-25 11:26:11 +02:00
warn.h objtool: Rename find_containing_func() 2020-03-25 18:28:29 +01:00
weak.c objtool: Refactor ORC section generation 2022-07-25 11:26:05 +02:00