10 Sep, 2020

1 commit

  • Unwind hints are useful to provide objtool with information about stack
    states in non-standard functions/code.

    While the type of information being provided might be very arch
    specific, the mechanism to provide the information can be useful for
    other architectures.

    Move the relevant unwint hint definitions for all architectures to
    see.

    [ jpoimboe: REGS_IRET -> REGS_PARTIAL ]

    Signed-off-by: Julien Thierry
    Signed-off-by: Josh Poimboeuf

    Julien Thierry
     

02 Sep, 2020

1 commit

  • Orc generation is only done for text sections, but some instructions
    can be found in non-text sections (e.g. .discard.text sections).

    Skip setting their orc sections since their whole sections will be
    skipped for orc generation.

    Reviewed-by: Miroslav Benes
    Signed-off-by: Julien Thierry
    Signed-off-by: Josh Poimboeuf

    Julien Thierry
     

01 Sep, 2020

1 commit

  • Add the inline static call implementation for x86-64. The generated code
    is identical to the out-of-line case, except we move the trampoline into
    it's own section.

    Objtool uses the trampoline naming convention to detect all the call
    sites. It then annotates those call sites in the .static_call_sites
    section.

    During boot (and module init), the call sites are patched to call
    directly into the destination function. The temporary trampoline is
    then no longer used.

    [peterz: merged trampolines, put trampoline in section]

    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Peter Zijlstra (Intel)
    Signed-off-by: Ingo Molnar
    Cc: Linus Torvalds
    Link: https://lore.kernel.org/r/20200818135804.864271425@infradead.org

    Josh Poimboeuf
     

18 Jun, 2020

2 commits


03 Jun, 2020

1 commit

  • Currently objtool only collects information about relocations with
    addends. In recordmcount, which we are about to merge into objtool,
    some supported architectures do not use rela relocations.

    Signed-off-by: Matt Helsley
    Reviewed-by: Julien Thierry
    Reviewed-by: Kamalesh Babulal
    Signed-off-by: Josh Poimboeuf

    Matt Helsley
     

01 Jun, 2020

1 commit

  • Before supporting additional relocation types rename the relevant
    types and functions from "rela" to "reloc". This work be done with
    the following regex:

    sed -e 's/struct rela/struct reloc/g' \
    -e 's/\([_\*]\)rela\(s\{0,1\}\)/\1reloc\2/g' \
    -e 's/tmprela\(s\{0,1\}\)/tmpreloc\1/g' \
    -e 's/relasec/relocsec/g' \
    -e 's/rela_list/reloc_list/g' \
    -e 's/rela_hash/reloc_hash/g' \
    -e 's/add_rela/add_reloc/g' \
    -e 's/rela->/reloc->/g' \
    -e '/rela[,\.]/{ s/\([^\.>]\)rela\([\.,]\)/\1reloc\2/g ; }' \
    -e 's/rela =/reloc =/g' \
    -e 's/relas =/relocs =/g' \
    -e 's/relas\[/relocs[/g' \
    -e 's/relaname =/relocname =/g' \
    -e 's/= rela\;/= reloc\;/g' \
    -e 's/= relas\;/= relocs\;/g' \
    -e 's/= relaname\;/= relocname\;/g' \
    -e 's/, rela)/, reloc)/g' \
    -e 's/\([ @]\)rela\([ "]\)/\1reloc\2/g' \
    -e 's/ rela$/ reloc/g' \
    -e 's/, relaname/, relocname/g' \
    -e 's/sec->rela/sec->reloc/g' \
    -e 's/(\(!\{0,1\}\)rela/(\1reloc/g' \
    -i \
    arch.h \
    arch/x86/decode.c \
    check.c \
    check.h \
    elf.c \
    elf.h \
    orc_gen.c \
    special.c

    Notable exceptions which complicate the regex include gelf_*
    library calls and standard/expected section names which still use
    "rela" because they encode the type of relocation expected. Also, keep
    "rela" in the struct because it encodes a specific type of relocation
    we currently expect.

    It will eventually turn into a member of an anonymous union when a
    susequent patch adds implicit addend, or "rel", relocation support.

    Signed-off-by: Matt Helsley
    Signed-off-by: Josh Poimboeuf

    Matt Helsley
     

20 May, 2020

1 commit

  • Objtool currently only compiles for x86 architectures. This is
    fine as it presently does not support tooling for other
    architectures. However, we would like to be able to convert other
    kernel tools to run as objtool sub commands because they too
    process ELF object files. This will allow us to convert tools
    such as recordmcount to use objtool's ELF code.

    Since much of recordmcount's ELF code is copy-paste code to/from
    a variety of other kernel tools (look at modpost for example) this
    means that if we can convert recordmcount we can convert more.

    We define weak definitions for subcommand entry functions and other weak
    definitions for shared functions critical to building existing
    subcommands. These return 127 when the command is missing which signify
    tools that do not exist on all architectures. In this case the "check"
    and "orc" tools do not exist on all architectures so we only add them
    for x86. Future changes adding support for "check", to arm64 for
    example, can then modify the SUBCMD_CHECK variable when building for
    arm64.

    Objtool is not currently wired in to KConfig to be built for other
    architectures because it's not needed for those architectures and
    there are no commands it supports other than those for x86. As more
    command support is enabled on various architectures the necessary
    KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
    trigger building objtool.

    [ jpoimboe: remove aliases, add __weak macro, add error messages ]

    Cc: Julien Thierry
    Signed-off-by: Matt Helsley
    Signed-off-by: Josh Poimboeuf

    Matt Helsley
     

22 Apr, 2020

2 commits

  • When doing kbuild tests to see if the objtool changes affected those I
    found that there was a measurable regression:

    pre post

    real 1m13.594 1m16.488s
    user 34m58.246s 35m23.947s
    sys 4m0.393s 4m27.312s

    Perf showed that for small files the increased hash-table sizes were a
    measurable difference. Since we already have -l "vmlinux" to
    distinguish between the modes, make it also use a smaller portion of
    the hash-tables.

    This flips it into a small win:

    real 1m14.143s
    user 34m49.292s
    sys 3m44.746s

    Signed-off-by: Peter Zijlstra (Intel)
    Reviewed-by: Miroslav Benes
    Reviewed-by: Alexandre Chartre
    Acked-by: Josh Poimboeuf
    Link: https://lkml.kernel.org/r/20200416115119.167588731@infradead.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Objtool keeps per instruction CFI state in struct insn_state and will
    save/restore this where required. However, insn_state has grown some
    !CFI state, and this must not be saved/restored (that would
    loose/destroy state).

    Fix this by moving the CFI specific parts of insn_state into struct
    cfi_state.

    Signed-off-by: Peter Zijlstra (Intel)
    Reviewed-by: Miroslav Benes
    Reviewed-by: Alexandre Chartre
    Acked-by: Josh Poimboeuf
    Link: https://lkml.kernel.org/r/20200416115119.045821071@infradead.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

14 Apr, 2020

1 commit

  • When compiling the kernel with AS=clang, objtool produces a lot of
    warnings:

    warning: objtool: missing symbol for section .text
    warning: objtool: missing symbol for section .init.text
    warning: objtool: missing symbol for section .ref.text

    It then fails to generate the ORC table.

    The problem is that objtool assumes text section symbols always exist.
    But the Clang assembler is aggressive about removing them.

    When generating relocations for the ORC table, objtool always tries to
    reference instructions by their section symbol offset. If the section
    symbol doesn't exist, it bails.

    Do a fallback: when a section symbol isn't available, reference a
    function symbol instead.

    Reported-by: Dmitry Golovin
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Borislav Petkov
    Tested-by: Nathan Chancellor
    Reviewed-by: Miroslav Benes
    Acked-by: Peter Zijlstra (Intel)
    Link: https://github.com/ClangBuiltLinux/linux/issues/669
    Link: https://lkml.kernel.org/r/9a9cae7fcf628843aabe5a086b1a3c5bf50f42e8.1585761021.git.jpoimboe@redhat.com

    Josh Poimboeuf
     

26 Mar, 2020

1 commit

  • Perf showed that __hash_init() is a significant portion of
    read_sections(), so instead of doing a per section rela_hash, use an
    elf-wide rela_hash.

    Statistics show us there are about 1.1 million relas, so size it
    accordingly.

    This reduces the objtool on vmlinux.o runtime to a third, from 15 to 5
    seconds.

    Signed-off-by: Peter Zijlstra (Intel)
    Reviewed-by: Miroslav Benes
    Acked-by: Josh Poimboeuf
    Link: https://lkml.kernel.org/r/20200324160924.739153726@infradead.org

    Peter Zijlstra
     

21 May, 2019

1 commit

  • Based on 2 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version this program is distributed in the
    hope that it will be useful but without any warranty without even
    the implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details you
    should have received a copy of the gnu general public license along
    with this program if not see http www gnu org licenses

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version this program is distributed in the
    hope that it will be useful but without any warranty without even
    the implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details [based]
    [from] [clk] [highbank] [c] you should have received a copy of the
    gnu general public license along with this program if not see http
    www gnu org licenses

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 355 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Kate Stewart
    Reviewed-by: Jilayne Lovejoy
    Reviewed-by: Steve Winslow
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190519154041.837383322@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

21 Jun, 2018

1 commit

  • The existing UNWIND_HINT_EMPTY annotations happen to be good indicators
    of where entry code calls into C code for the first time. So also use
    them to mark the end of the stack for the ORC unwinder.

    Use that information to set unwind->error if the ORC unwinder doesn't
    unwind all the way to the end. This will be needed for enabling
    HAVE_RELIABLE_STACKTRACE for the ORC unwinder so we can use it with the
    livepatch consistency model.

    Thanks to Jiri Slaby for teaching the ORCs about the unwind hints.

    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Jiri Slaby
    Acked-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: https://lkml.kernel.org/lkml/20180518064713.26440-5-jslaby@suse.cz
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

30 Jan, 2018

1 commit

  • With the following fix:

    2a0098d70640 ("objtool: Fix seg fault with gold linker")

    ... a seg fault was avoided, but the original seg fault condition in
    objtool wasn't fixed. Replace the seg fault with an error message.

    Suggested-by: Ingo Molnar
    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: David Woodhouse
    Cc: Greg Kroah-Hartman
    Cc: Guenter Roeck
    Cc: H. Peter Anvin
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/dc4585a70d6b975c99fc51d1957ccdde7bd52f3a.1517284349.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

31 Dec, 2017

1 commit

  • Fix a seg fault which happens when an input file provided to 'objtool
    orc generate' doesn't have a '.shstrtab' section (for instance, object
    files produced by clang don't have this section).

    Signed-off-by: Simon Ser
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/c0f2231683e9bed40fac1f13ce2c33b8389854bc.1514666459.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Simon Ser
     

18 Jul, 2017

1 commit

  • Now that objtool knows the states of all registers on the stack for each
    instruction, it's straightforward to generate debuginfo for an unwinder
    to use.

    Instead of generating DWARF, generate a new format called ORC, which is
    more suitable for an in-kernel unwinder. See
    Documentation/x86/orc-unwinder.txt for a more detailed description of
    this new debuginfo format and why it's preferable to DWARF.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Jiri Slaby
    Cc: Linus Torvalds
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/c9b9f01ba6c5ed2bdc9bb0957b78167fdbf9632e.1499786555.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf