scripts: Optimize code segmentation script. [1/3]

PD#SWPL-141925

Problem:
Solving code segmentation issues.

Solution:
Solving code segmentation issues.

Verify:
N/A

Change-Id: I521138b12d2fc919b232ac9d9ddc0f664a0416b9
Signed-off-by: shijie.xiong <shijie.xiong@amlogic.com>
diff --git a/c3_fastboot.sh b/c3_fastboot.sh
index 8108165..0586133 100755
--- a/c3_fastboot.sh
+++ b/c3_fastboot.sh
@@ -159,7 +159,7 @@
 #Compile toolchain preparation
 toolchain_prepare
 #compile the rtos image
-cd $RTOS_BASE_DIR && make scatter
+cd $RTOS_BASE_DIR && make
 #lz4 compression
 lz4_rtos
 #compile the bl22 image
diff --git a/gen_scatter_lib.sh b/gen_scatter_lib.sh
index 6695403..654ebef 100755
--- a/gen_scatter_lib.sh
+++ b/gen_scatter_lib.sh
@@ -7,12 +7,63 @@
 
 #Toolchain
 OBJCOPY=${TOOLCHAIN_KEYWORD}-objcopy
+OBJDUMP=${TOOLCHAIN_KEYWORD}-objdump
+RTOS_BUILD_DIR=$(realpath $(dirname $(readlink -f ${BASH_SOURCE[0]:-$0}))/..)
+
+#Get specified segment name.
+function generate_segment_name() {
+
+	SEGMENT_PREFIX="late"
+
+	if [ ! -z "$1" ]; then
+		if [[ $1 =~ ^\..* || $1 =~ .*\. ]]; then
+			echo -e "\033[41;33m Notice: The segment name should be a pure string, excluding symbols. \033[0m"
+			exit 1
+		else
+			SEGMENT_PREFIX=$1
+		fi
+	fi
+}
+
+#Generate segmented rule file
+function generate_segment_rule_file() {
+
+	ARCH_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/arch/$ARCH/scatter_load.mk
+	BOARD_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/boards/$ARCH/$BOARD/scatter_load.mk
+
+	FIX_PART_STRING="#Object files and dependency definitions\n\
+RTOS_SOURCE_IMAGE = \$(kernel_BUILD_DIR)/\$(KERNEL).elf\n\
+RTOS_LOAD_A = \$(kernel_BUILD_DIR)/rtos_1.bin\n\
+RTOS_LOAD_B = \$(kernel_BUILD_DIR)/rtos_2.bin\n\n\
+#toolchain\n\
+OBJCOPY:=\$(TOOLCHAIN_KEYWORD)-objcopy\n\n"
+
+	SEGMENT_LOAD_LIST="#Specify link segment\n\
+segment_load_list+=.$SEGMENT_PREFIX.data .$SEGMENT_PREFIX.rodata .$SEGMENT_PREFIX.text\n\n"
+
+	GENERATE_TARGET="# Image compilation post-processing\n\
+.PHONY: scatter\n\
+scatter:\n\
+\t@\${OBJCOPY} -O binary \$(addprefix -R ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_A};\n\
+\t@\${OBJCOPY} -O binary \$(addprefix -j ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_B};"
+
+	if [ -f "$BOARD_DEFAULT_MAKEFILE" ]; then
+		echo "board default makefile----------------"
+		cp $BOARD_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
+	elif [ -f "$ARCH_DEFAULT_MAKEFILE" ]; then
+		echo "arch default makefile----------------"
+		cp $ARCH_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
+	else
+		echo "auto generate makefile----------------"
+		echo -e "${FIX_PART_STRING}${SEGMENT_LOAD_LIST}${GENERATE_TARGET}" >$RTOS_BUILD_DIR/build_system/scatter_load.mk
+	fi
+}
 
 #Parse object file segment information
 function parse_segment_information() {
-	TEXT_SECTION=$(readelf -t $1 | grep -wo .text.* | sort -u | uniq)
-	DATA_SECTION=$(readelf -t $1 | grep -wo .data.* | sort -u | uniq)
-	RODATA_SECTION=$(readelf -t $1 | grep -wo .rodata.* | sort -u | uniq)
+	TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text[^ ]*' | sort -u | uniq)
+	DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data[^ ]*' | sort -u | uniq)
+	RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata[^ ]*' | sort -u | uniq)
 	TEXT_ARRY=(${TEXT_SECTION// /})
 	DATA_ARRY=(${DATA_SECTION// /})
 	RODATA_ARRY=(${RODATA_SECTION// /})
@@ -20,30 +71,60 @@
 
 #Replace the target file segment name
 function rename_target_file_segment() {
+
 	RELINK_FLAG="-p"
+
 	for value in ${TEXT_ARRY[@]}; do
-		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.late${value}"
+		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
 	done
 
 	for value in ${DATA_ARRY[@]}; do
-		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.late${value}"
+		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
 	done
 
 	for value in ${RODATA_ARRY[@]}; do
-		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.late${value}"
+		RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
 	done
 
-	${OBJCOPY} ${RELINK_FLAG} $1 $1
+	if [ "$RELINK_FLAG" != "-p" ]; then
+		${OBJCOPY} ${RELINK_FLAG} $1 $1
+	fi
 }
 
-if [ -z "$1" ]; then
-	echo -e "\033[41;33m Notice: .a library file not specified \033[0m"
-	echo -e "\033[33m usage: ./gen_scatter_lib.sh xxx.a \033[0m"
+#Search and process target files in the specified directory.
+function search_and_process_specified_directory() {
+
+	OBJ_FILES=$(find $1 -type f -name "*.obj")
+
+	for file in $OBJ_FILES; do
+		parse_segment_information $file
+		rename_target_file_segment $file
+	done
+}
+
+function show_help() {
+	echo -e "\033[41;33m Notice: Invalid parameters, please refer to the following examples. \033[0m"
+	echo -e "\e[1;35m [example]\e[0m"
+	echo "    (1) Rename static library section names to default name(.late)."
+	echo "    $0 example.a"
+	echo "    (2) Rename static library section names to specified names(.sram)."
+	echo "    $0 example.a sram"
+	echo "    (3) Rename program section names of target files in the specified directory."
+	echo "    $0 /example/obj"
+	echo "    (4) Rename the section names of target files in the specified directory to the specified names."
+	echo "    $0 /example/obj sram"
 	exit 1
-elif [ ! -f "$1" ]; then
-	echo -e "\033[41;33m Notice: Please specify a valid library file \033[0m"
-	exit 1
-else
+}
+
+generate_segment_name $2
+generate_segment_rule_file
+
+if [ -s "$1" ] && [ -f "$1" ]; then
 	parse_segment_information $1
 	rename_target_file_segment $1
+elif [ -d "$1" ]; then
+	search_and_process_specified_directory $1
+else
+	show_help
+	exit 1
 fi