mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 10:10:33 +02:00 
			
		
		
		
	scripts/faddr2line: extend usage on generic arch
When cross-compiling, fadd2line should use the binary tool used for the target system, rather than that of the host. Link: http://lkml.kernel.org/r/20171121092911.GA150711@sofia Signed-off-by: Liu Changcheng <changcheng.liu@intel.com> Cc: Kate Stewart <kstewart@linuxfoundation.org> Cc: NeilBrown <neilb@suse.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									5c9d2d5c26
								
							
						
					
					
						commit
						95a8798254
					
				
					 1 changed files with 14 additions and 7 deletions
				
			
		| 
						 | 
					@ -44,9 +44,16 @@
 | 
				
			||||||
set -o errexit
 | 
					set -o errexit
 | 
				
			||||||
set -o nounset
 | 
					set -o nounset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					READELF="${CROSS_COMPILE}readelf"
 | 
				
			||||||
 | 
					ADDR2LINE="${CROSS_COMPILE}addr2line"
 | 
				
			||||||
 | 
					SIZE="${CROSS_COMPILE}size"
 | 
				
			||||||
 | 
					NM="${CROSS_COMPILE}nm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
command -v awk >/dev/null 2>&1 || die "awk isn't installed"
 | 
					command -v awk >/dev/null 2>&1 || die "awk isn't installed"
 | 
				
			||||||
command -v readelf >/dev/null 2>&1 || die "readelf isn't installed"
 | 
					command -v ${READELF} >/dev/null 2>&1 || die "readelf isn't installed"
 | 
				
			||||||
command -v addr2line >/dev/null 2>&1 || die "addr2line isn't installed"
 | 
					command -v ${ADDR2LINE} >/dev/null 2>&1 || die "addr2line isn't installed"
 | 
				
			||||||
 | 
					command -v ${SIZE} >/dev/null 2>&1 || die "size isn't installed"
 | 
				
			||||||
 | 
					command -v ${NM} >/dev/null 2>&1 || die "nm isn't installed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
usage() {
 | 
					usage() {
 | 
				
			||||||
	echo "usage: faddr2line <object file> <func+offset> <func+offset>..." >&2
 | 
						echo "usage: faddr2line <object file> <func+offset> <func+offset>..." >&2
 | 
				
			||||||
| 
						 | 
					@ -69,10 +76,10 @@ die() {
 | 
				
			||||||
find_dir_prefix() {
 | 
					find_dir_prefix() {
 | 
				
			||||||
	local objfile=$1
 | 
						local objfile=$1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local start_kernel_addr=$(readelf -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}')
 | 
						local start_kernel_addr=$(${READELF} -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}')
 | 
				
			||||||
	[[ -z $start_kernel_addr ]] && return
 | 
						[[ -z $start_kernel_addr ]] && return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local file_line=$(addr2line -e $objfile $start_kernel_addr)
 | 
						local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr)
 | 
				
			||||||
	[[ -z $file_line ]] && return
 | 
						[[ -z $file_line ]] && return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local prefix=${file_line%init/main.c:*}
 | 
						local prefix=${file_line%init/main.c:*}
 | 
				
			||||||
| 
						 | 
					@ -104,7 +111,7 @@ __faddr2line() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# 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 rare cases there might be duplicates.
 | 
				
			||||||
	file_end=$(size -Ax $objfile | awk '$1 == ".text" {print $2}')
 | 
						file_end=$(${SIZE} -Ax $objfile | awk '$1 == ".text" {print $2}')
 | 
				
			||||||
	while read symbol; do
 | 
						while read symbol; do
 | 
				
			||||||
		local fields=($symbol)
 | 
							local fields=($symbol)
 | 
				
			||||||
		local sym_base=0x${fields[0]}
 | 
							local sym_base=0x${fields[0]}
 | 
				
			||||||
| 
						 | 
					@ -156,10 +163,10 @@ __faddr2line() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# pass real address to addr2line
 | 
							# pass real address to addr2line
 | 
				
			||||||
		echo "$func+$offset/$sym_size:"
 | 
							echo "$func+$offset/$sym_size:"
 | 
				
			||||||
		addr2line -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;"
 | 
							${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;"
 | 
				
			||||||
		DONE=1
 | 
							DONE=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	done < <(nm -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }')
 | 
						done < <(${NM} -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[ $# -lt 2 ]] && usage
 | 
					[[ $# -lt 2 ]] && usage
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue