mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-17 20:54:10 +00:00
Build tool updates:
- 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. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmKvHbwTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoQlsEADC7BotE1Mi8HITScIlHT19bkZ7Bm6M g46RCtUw0u+lo7BclIetNYGWQ0z+D+1DbmZTBv5D22N/Wd6MrwOuuwRVtJ2dEosF l/EK1qKLxCGMdQ1x0KOmrjzHB4WmcUH0pQwDHa5N5s5IyrJRRFHtoLk3EYp6QIhi mIZTJgGUEe/aS7BtFM5xARprm7JxdbhXgXVbnC1ctzpOi2y6O7F4Ek3x4j5zTGV/ 49iuO2ljqmKdoFlPa1fhuw+O9sTUf+RmKLPEU+2nm7Wg+wlIwKIB3yDDBoZ9Q7lm YdorW0/506x4qOwa8KAjxXEb2qgZkL/fQcMS0jQQKNNDD8GHU+3YdjCNbrmZjA+T Ib0rs9YsxgLstnmqzU3QfarhgtdzIMhzF0cofoFDK0a8tHLqOhZF4j7wLmYo52ec 6Hrt8IvJPW2b3TC6KfRAF+uWsDDoaum0OOFVjVu1b9G6fFf0i8h5JGWdkJh8cau9 0qvAYg0sDjRf7zAZ6kbbGDVCljECyypIdCBF3ihA6yMhJX16VihEWTJyqIaoO+a0 0XzPvkhX+6mY0kqn+5HvvhLEY4POA8pFKeTPx4eABvKnw7m01I9cJfHa7HEBQHe6 ZJA7qWMBRrPfK2Ogrx8zohj2sOdHMHlIQU+6Ai+7+BHs13Nje4umGMu2YuZrnfIF gQ1ayCN8OsUwVA== =12KJ -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
5d770f11a1
6 changed files with 55 additions and 19 deletions
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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:
|
||||||
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)
|
||||||
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 {
|
||||||
.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
|
||||||
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() {
|
||||||
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() {
|
||||||
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() {
|
||||||
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() {
|
||||||
|
|
||||||
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() {
|
||||||
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() {
|
||||||
[[ $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 {
|
||||||
.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
|
||||||
|
|
Loading…
Add table
Reference in a new issue