Commit 5d770f11 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'objtool-urgent-2022-06-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull build tooling updates from Thomas Gleixner:

 - Remove obsolete CONFIG_X86_SMAP reference from objtool

 - Fix overlapping text section failures in faddr2line for real

 - Remove OBJECT_FILES_NON_STANDARD usage from x86 ftrace and replace it
   with finegrained annotations so objtool can validate that code
   correctly.

* tag 'objtool-urgent-2022-06-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/ftrace: Remove OBJECT_FILES_NON_STANDARD usage
  faddr2line: Fix overlapping text section failures, the sequel
  objtool: Fix obsolete reference to CONFIG_X86_SMAP
parents 727c3991 7b6c7a87
...@@ -36,10 +36,6 @@ KCSAN_SANITIZE := n ...@@ -36,10 +36,6 @@ KCSAN_SANITIZE := n
OBJECT_FILES_NON_STANDARD_test_nx.o := y OBJECT_FILES_NON_STANDARD_test_nx.o := y
ifdef CONFIG_FRAME_POINTER
OBJECT_FILES_NON_STANDARD_ftrace_$(BITS).o := y
endif
# If instrumentation of this dir is enabled, boot hangs during first second. # If instrumentation of this dir is enabled, boot hangs during first second.
# Probably could be more selective here, but note that files related to irqs, # Probably could be more selective here, but note that files related to irqs,
# boot, dumpstack/stacktrace, etc are either non-interesting or can lead to # boot, dumpstack/stacktrace, etc are either non-interesting or can lead to
......
...@@ -175,6 +175,7 @@ SYM_INNER_LABEL(ftrace_caller_end, SYM_L_GLOBAL) ...@@ -175,6 +175,7 @@ SYM_INNER_LABEL(ftrace_caller_end, SYM_L_GLOBAL)
jmp ftrace_epilogue jmp ftrace_epilogue
SYM_FUNC_END(ftrace_caller); SYM_FUNC_END(ftrace_caller);
STACK_FRAME_NON_STANDARD_FP(ftrace_caller)
SYM_FUNC_START(ftrace_epilogue) SYM_FUNC_START(ftrace_epilogue)
/* /*
...@@ -282,6 +283,7 @@ SYM_INNER_LABEL(ftrace_regs_caller_end, SYM_L_GLOBAL) ...@@ -282,6 +283,7 @@ SYM_INNER_LABEL(ftrace_regs_caller_end, SYM_L_GLOBAL)
jmp ftrace_epilogue jmp ftrace_epilogue
SYM_FUNC_END(ftrace_regs_caller) SYM_FUNC_END(ftrace_regs_caller)
STACK_FRAME_NON_STANDARD_FP(ftrace_regs_caller)
#else /* ! CONFIG_DYNAMIC_FTRACE */ #else /* ! CONFIG_DYNAMIC_FTRACE */
...@@ -311,10 +313,14 @@ trace: ...@@ -311,10 +313,14 @@ trace:
jmp ftrace_stub jmp ftrace_stub
SYM_FUNC_END(__fentry__) SYM_FUNC_END(__fentry__)
EXPORT_SYMBOL(__fentry__) EXPORT_SYMBOL(__fentry__)
STACK_FRAME_NON_STANDARD_FP(__fentry__)
#endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* CONFIG_DYNAMIC_FTRACE */
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
SYM_FUNC_START(return_to_handler) SYM_CODE_START(return_to_handler)
UNWIND_HINT_EMPTY
ANNOTATE_NOENDBR
subq $16, %rsp subq $16, %rsp
/* Save the return values */ /* Save the return values */
...@@ -339,7 +345,6 @@ SYM_FUNC_START(return_to_handler) ...@@ -339,7 +345,6 @@ SYM_FUNC_START(return_to_handler)
int3 int3
.Ldo_rop: .Ldo_rop:
mov %rdi, (%rsp) mov %rdi, (%rsp)
UNWIND_HINT_FUNC
RET RET
SYM_FUNC_END(return_to_handler) SYM_CODE_END(return_to_handler)
#endif #endif
...@@ -143,6 +143,12 @@ struct unwind_hint { ...@@ -143,6 +143,12 @@ struct unwind_hint {
.popsection .popsection
.endm .endm
.macro STACK_FRAME_NON_STANDARD_FP func:req
#ifdef CONFIG_FRAME_POINTER
STACK_FRAME_NON_STANDARD \func
#endif
.endm
.macro ANNOTATE_NOENDBR .macro ANNOTATE_NOENDBR
.Lhere_\@: .Lhere_\@:
.pushsection .discard.noendbr .pushsection .discard.noendbr
......
...@@ -94,7 +94,7 @@ config UBSAN_UNREACHABLE ...@@ -94,7 +94,7 @@ config UBSAN_UNREACHABLE
bool "Perform checking for unreachable code" bool "Perform checking for unreachable code"
# objtool already handles unreachable checking and gets angry about # objtool already handles unreachable checking and gets angry about
# seeing UBSan instrumentation located in unreachable places. # seeing UBSan instrumentation located in unreachable places.
depends on !(OBJTOOL && (STACK_VALIDATION || UNWINDER_ORC || X86_SMAP)) depends on !(OBJTOOL && (STACK_VALIDATION || UNWINDER_ORC || HAVE_UACCESS_VALIDATION))
depends on $(cc-option,-fsanitize=unreachable) depends on $(cc-option,-fsanitize=unreachable)
help help
This option enables -fsanitize=unreachable which checks for control This option enables -fsanitize=unreachable which checks for control
......
...@@ -95,17 +95,25 @@ __faddr2line() { ...@@ -95,17 +95,25 @@ __faddr2line() {
local print_warnings=$4 local print_warnings=$4
local sym_name=${func_addr%+*} local sym_name=${func_addr%+*}
local offset=${func_addr#*+} local func_offset=${func_addr#*+}
offset=${offset%/*} func_offset=${func_offset%/*}
local user_size= local user_size=
local file_type
local is_vmlinux=0
[[ $func_addr =~ "/" ]] && user_size=${func_addr#*/} [[ $func_addr =~ "/" ]] && user_size=${func_addr#*/}
if [[ -z $sym_name ]] || [[ -z $offset ]] || [[ $sym_name = $func_addr ]]; then if [[ -z $sym_name ]] || [[ -z $func_offset ]] || [[ $sym_name = $func_addr ]]; then
warn "bad func+offset $func_addr" warn "bad func+offset $func_addr"
DONE=1 DONE=1
return return
fi fi
# vmlinux uses absolute addresses in the section table rather than
# section offsets.
local file_type=$(${READELF} --file-header $objfile |
${AWK} '$1 == "Type:" { print $2; exit }')
[[ $file_type = "EXEC" ]] && is_vmlinux=1
# Go through each of the object's symbols which match the func name. # Go through each of the object's symbols which match the func name.
# In rare cases there might be duplicates, in which case we print all # In rare cases there might be duplicates, in which case we print all
# matches. # matches.
...@@ -114,9 +122,11 @@ __faddr2line() { ...@@ -114,9 +122,11 @@ __faddr2line() {
local sym_addr=0x${fields[1]} local sym_addr=0x${fields[1]}
local sym_elf_size=${fields[2]} local sym_elf_size=${fields[2]}
local sym_sec=${fields[6]} local sym_sec=${fields[6]}
local sec_size
local sec_name
# Get the section size: # Get the section size:
local sec_size=$(${READELF} --section-headers --wide $objfile | sec_size=$(${READELF} --section-headers --wide $objfile |
sed 's/\[ /\[/' | sed 's/\[ /\[/' |
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }') ${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }')
...@@ -126,6 +136,17 @@ __faddr2line() { ...@@ -126,6 +136,17 @@ __faddr2line() {
return return
fi fi
# Get the section name:
sec_name=$(${READELF} --section-headers --wide $objfile |
sed 's/\[ /\[/' |
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print $2; exit }')
if [[ -z $sec_name ]]; then
warn "bad section name: section: $sym_sec"
DONE=1
return
fi
# Calculate the symbol size. # Calculate the symbol size.
# #
# Unfortunately we can't use the ELF size, because kallsyms # Unfortunately we can't use the ELF size, because kallsyms
...@@ -174,10 +195,10 @@ __faddr2line() { ...@@ -174,10 +195,10 @@ __faddr2line() {
sym_size=0x$(printf %x $sym_size) sym_size=0x$(printf %x $sym_size)
# Calculate the section address from user-supplied offset: # Calculate the address from user-supplied offset:
local addr=$(($sym_addr + $offset)) local addr=$(($sym_addr + $func_offset))
if [[ -z $addr ]] || [[ $addr = 0 ]]; then if [[ -z $addr ]] || [[ $addr = 0 ]]; then
warn "bad address: $sym_addr + $offset" warn "bad address: $sym_addr + $func_offset"
DONE=1 DONE=1
return return
fi fi
...@@ -191,9 +212,9 @@ __faddr2line() { ...@@ -191,9 +212,9 @@ __faddr2line() {
fi fi
# Make sure the provided offset is within the symbol's range: # Make sure the provided offset is within the symbol's range:
if [[ $offset -gt $sym_size ]]; then if [[ $func_offset -gt $sym_size ]]; then
[[ $print_warnings = 1 ]] && [[ $print_warnings = 1 ]] &&
echo "skipping $sym_name address at $addr due to size mismatch ($offset > $sym_size)" echo "skipping $sym_name address at $addr due to size mismatch ($func_offset > $sym_size)"
continue continue
fi fi
...@@ -202,11 +223,13 @@ __faddr2line() { ...@@ -202,11 +223,13 @@ __faddr2line() {
[[ $FIRST = 0 ]] && echo [[ $FIRST = 0 ]] && echo
FIRST=0 FIRST=0
echo "$sym_name+$offset/$sym_size:" echo "$sym_name+$func_offset/$sym_size:"
# Pass section address to addr2line and strip absolute paths # Pass section address to addr2line and strip absolute paths
# from the output: # from the output:
local output=$(${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;") local args="--functions --pretty-print --inlines --exe=$objfile"
[[ $is_vmlinux = 0 ]] && args="$args --section=$sec_name"
local output=$(${ADDR2LINE} $args $addr | sed "s; $dir_prefix\(\./\)*; ;")
[[ -z $output ]] && continue [[ -z $output ]] && continue
# Default output (non --list): # Default output (non --list):
......
...@@ -143,6 +143,12 @@ struct unwind_hint { ...@@ -143,6 +143,12 @@ struct unwind_hint {
.popsection .popsection
.endm .endm
.macro STACK_FRAME_NON_STANDARD_FP func:req
#ifdef CONFIG_FRAME_POINTER
STACK_FRAME_NON_STANDARD \func
#endif
.endm
.macro ANNOTATE_NOENDBR .macro ANNOTATE_NOENDBR
.Lhere_\@: .Lhere_\@:
.pushsection .discard.noendbr .pushsection .discard.noendbr
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment