blob: 9159de25e355a65742e56cb8f82e3e5decbd33e5 [file] [log] [blame]
shijie.xiong6760c482022-10-19 14:56:28 +08001#!/bin/bash
2#
3# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
4#
5# SPDX-License-Identifier: MIT
6#
7
8#Toolchain
9OBJCOPY=${TOOLCHAIN_KEYWORD}-objcopy
shijie.xiong26895eb2023-10-09 11:28:08 +080010OBJDUMP=${TOOLCHAIN_KEYWORD}-objdump
11RTOS_BUILD_DIR=$(realpath $(dirname $(readlink -f ${BASH_SOURCE[0]:-$0}))/..)
12
shijie.xiong2d11f372024-04-25 17:49:01 +080013#Default configuration parameters
14SEGMENT_NAME=""
15SEGMENT_CONFIG_FILE=""
16SEGMENT_RENAME_FILE=""
17SEGMENT_RENAME_DIRECTORY=""
18SEGMENT_RENAME_IGNORE_LIST=()
19
shijie.xiong26895eb2023-10-09 11:28:08 +080020#Get specified segment name.
21function generate_segment_name() {
shijie.xiong26895eb2023-10-09 11:28:08 +080022 SEGMENT_PREFIX="late"
23
24 if [ ! -z "$1" ]; then
25 if [[ $1 =~ ^\..* || $1 =~ .*\. ]]; then
26 echo -e "\033[41;33m Notice: The segment name should be a pure string, excluding symbols. \033[0m"
27 exit 1
28 else
29 SEGMENT_PREFIX=$1
30 fi
31 fi
32}
33
34#Generate segmented rule file
35function generate_segment_rule_file() {
36
37 ARCH_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/arch/$ARCH/scatter_load.mk
38 BOARD_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/boards/$ARCH/$BOARD/scatter_load.mk
39
40 FIX_PART_STRING="#Object files and dependency definitions\n\
41RTOS_SOURCE_IMAGE = \$(kernel_BUILD_DIR)/\$(KERNEL).elf\n\
42RTOS_LOAD_A = \$(kernel_BUILD_DIR)/rtos_1.bin\n\
43RTOS_LOAD_B = \$(kernel_BUILD_DIR)/rtos_2.bin\n\n\
44#toolchain\n\
45OBJCOPY:=\$(TOOLCHAIN_KEYWORD)-objcopy\n\n"
46
47 SEGMENT_LOAD_LIST="#Specify link segment\n\
48segment_load_list+=.$SEGMENT_PREFIX.data .$SEGMENT_PREFIX.rodata .$SEGMENT_PREFIX.text\n\n"
49
50 GENERATE_TARGET="# Image compilation post-processing\n\
51.PHONY: scatter\n\
52scatter:\n\
53\t@\${OBJCOPY} -O binary \$(addprefix -R ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_A};\n\
54\t@\${OBJCOPY} -O binary \$(addprefix -j ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_B};"
55
56 if [ -f "$BOARD_DEFAULT_MAKEFILE" ]; then
57 echo "board default makefile----------------"
58 cp $BOARD_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
59 elif [ -f "$ARCH_DEFAULT_MAKEFILE" ]; then
60 echo "arch default makefile----------------"
61 cp $ARCH_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
62 else
63 echo "auto generate makefile----------------"
64 echo -e "${FIX_PART_STRING}${SEGMENT_LOAD_LIST}${GENERATE_TARGET}" >$RTOS_BUILD_DIR/build_system/scatter_load.mk
65 fi
66}
shijie.xiong6760c482022-10-19 14:56:28 +080067
68#Parse object file segment information
69function parse_segment_information() {
shijie.xiongf562bd92023-10-20 14:13:46 +080070 if [ "$ARCH" = "xtensa" ]; then
71 TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text' | sort -u | uniq)
72 DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data' | sort -u | uniq)
73 RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata' | sort -u | uniq)
74 BSS_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.bss' | sort -u | uniq)
75 else
76 TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text[^ ]*' | sort -u | uniq)
77 DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data[^ ]*' | sort -u | uniq)
78 RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata[^ ]*' | sort -u | uniq)
79 BSS_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.bss[^ ]*' | sort -u | uniq)
80 fi
81
shijie.xiong6760c482022-10-19 14:56:28 +080082 TEXT_ARRY=(${TEXT_SECTION// /})
83 DATA_ARRY=(${DATA_SECTION// /})
84 RODATA_ARRY=(${RODATA_SECTION// /})
shijie.xiongf562bd92023-10-20 14:13:46 +080085 BSS_SECTION=(${BSS_SECTION// /})
shijie.xiong6760c482022-10-19 14:56:28 +080086}
87
88#Replace the target file segment name
89function rename_target_file_segment() {
shijie.xiong26895eb2023-10-09 11:28:08 +080090
shijie.xiong6760c482022-10-19 14:56:28 +080091 RELINK_FLAG="-p"
shijie.xiong26895eb2023-10-09 11:28:08 +080092
shijie.xiong6760c482022-10-19 14:56:28 +080093 for value in ${TEXT_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080094 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080095 done
96
97 for value in ${DATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080098 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080099 done
100
101 for value in ${RODATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +0800102 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +0800103 done
104
shijie.xiongf562bd92023-10-20 14:13:46 +0800105 if [ "$ARCH" = "xtensa" ]; then
106 for value in ${BSS_SECTION[@]}; do
107 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
108 done
109 fi
110
shijie.xiong26895eb2023-10-09 11:28:08 +0800111 if [ "$RELINK_FLAG" != "-p" ]; then
112 ${OBJCOPY} ${RELINK_FLAG} $1 $1
113 fi
shijie.xiong6760c482022-10-19 14:56:28 +0800114}
115
shijie.xiong26895eb2023-10-09 11:28:08 +0800116#Search and process target files in the specified directory.
117function search_and_process_specified_directory() {
118
119 OBJ_FILES=$(find $1 -type f -name "*.obj")
120
121 for file in $OBJ_FILES; do
shijie.xiong2d11f372024-04-25 17:49:01 +0800122 ignore_file_flag=false
123 for item in "${SEGMENT_RENAME_IGNORE_LIST[@]}"; do
124 ignore_file=$(basename "$item")
125 if [[ "$file" == *"$ignore_file"* ]]; then
126 ignore_file_flag=true
127 break
128 fi
129 done
130 if ! $ignore_file_flag; then
131 parse_segment_information $file
132 rename_target_file_segment $file
133 fi
shijie.xiong26895eb2023-10-09 11:28:08 +0800134 done
135}
136
137function show_help() {
138 echo -e "\033[41;33m Notice: Invalid parameters, please refer to the following examples. \033[0m"
139 echo -e "\e[1;35m [example]\e[0m"
140 echo " (1) Rename static library section names to default name(.late)."
141 echo " $0 example.a"
142 echo " (2) Rename static library section names to specified names(.sram)."
143 echo " $0 example.a sram"
144 echo " (3) Rename program section names of target files in the specified directory."
145 echo " $0 /example/obj"
146 echo " (4) Rename the section names of target files in the specified directory to the specified names."
147 echo " $0 /example/obj sram"
shijie.xiong6760c482022-10-19 14:56:28 +0800148 exit 1
shijie.xiong26895eb2023-10-09 11:28:08 +0800149}
150
shijie.xiong2d11f372024-04-25 17:49:01 +0800151arg1=$1
shijie.xiong26895eb2023-10-09 11:28:08 +0800152
shijie.xiong2d11f372024-04-25 17:49:01 +0800153#Script Execution Parameter Parsing
154while getopts ":e:c:h:d:n:f:i:" opt; do
155case ${opt} in
156 c )
157 SEGMENT_CONFIG_FILE=$OPTARG
158 echo $OPTARG
159 ;;
160 d )
161 SEGMENT_RENAME_DIRECTORY=$OPTARG
162 ;;
163 f )
164 SEGMENT_RENAME_FILE=$OPTARG
165 ;;
166 n )
167 SEGMENT_NAME=$OPTARG
168 ;;
169 i )
170 SEGMENT_RENAME_IGNORE_LIST+=($OPTARG)
171 ;;
172 e )
shijie.xiongb0207a92024-05-07 11:23:57 +0800173 generate_segment_name $SEGMENT_NAME
174 generate_segment_rule_file
175 echo "<---generate default rule--->"
shijie.xiong2d11f372024-04-25 17:49:01 +0800176 exit 0
177 ;;
178 h )
shijie.xiong26895eb2023-10-09 11:28:08 +0800179 show_help
180 exit 1
shijie.xiong2d11f372024-04-25 17:49:01 +0800181 ;;
182 \? )
183 echo "Invalid option: -$OPTARG" 1>&2
184 exit 1
185 ;;
186 : )
187 echo "Option -$OPTARG requires an argument" 1>&2
188 exit 1
189 ;;
190esac
191done
192shift $((OPTIND -1))
193
194#Segment Renaming Business Processing
195if [[ ${arg1:0:1} != "-" ]]; then
196 generate_segment_name $2
197 generate_segment_rule_file
198
199 if [ -s "$1" ] && [ -f "$1" ]; then
200 parse_segment_information $1
201 rename_target_file_segment $1
202 elif [ -d "$1" ]; then
203 search_and_process_specified_directory $1
204 else
205 show_help
206 exit 1
207 fi
208else
209 generate_segment_name $SEGMENT_NAME
210 generate_segment_rule_file
211
212 if [ -s "$SEGMENT_RENAME_FILE" ] && [ -f "$SEGMENT_RENAME_FILE" ]; then
213 parse_segment_information $SEGMENT_RENAME_FILE
214 rename_target_file_segment $SEGMENT_RENAME_FILE
215 elif [ -d "$SEGMENT_RENAME_DIRECTORY" ]; then
216 search_and_process_specified_directory $SEGMENT_RENAME_DIRECTORY
217 fi
shijie.xiong6760c482022-10-19 14:56:28 +0800218fi