blob: f79227a1d3a852a4139e35f60b633aaa6d5c79a2 [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
13#Get specified segment name.
14function generate_segment_name() {
15
16 SEGMENT_PREFIX="late"
17
18 if [ ! -z "$1" ]; then
19 if [[ $1 =~ ^\..* || $1 =~ .*\. ]]; then
20 echo -e "\033[41;33m Notice: The segment name should be a pure string, excluding symbols. \033[0m"
21 exit 1
22 else
23 SEGMENT_PREFIX=$1
24 fi
25 fi
26}
27
28#Generate segmented rule file
29function generate_segment_rule_file() {
30
31 ARCH_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/arch/$ARCH/scatter_load.mk
32 BOARD_DEFAULT_MAKEFILE=$RTOS_BUILD_DIR/boards/$ARCH/$BOARD/scatter_load.mk
33
34 FIX_PART_STRING="#Object files and dependency definitions\n\
35RTOS_SOURCE_IMAGE = \$(kernel_BUILD_DIR)/\$(KERNEL).elf\n\
36RTOS_LOAD_A = \$(kernel_BUILD_DIR)/rtos_1.bin\n\
37RTOS_LOAD_B = \$(kernel_BUILD_DIR)/rtos_2.bin\n\n\
38#toolchain\n\
39OBJCOPY:=\$(TOOLCHAIN_KEYWORD)-objcopy\n\n"
40
41 SEGMENT_LOAD_LIST="#Specify link segment\n\
42segment_load_list+=.$SEGMENT_PREFIX.data .$SEGMENT_PREFIX.rodata .$SEGMENT_PREFIX.text\n\n"
43
44 GENERATE_TARGET="# Image compilation post-processing\n\
45.PHONY: scatter\n\
46scatter:\n\
47\t@\${OBJCOPY} -O binary \$(addprefix -R ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_A};\n\
48\t@\${OBJCOPY} -O binary \$(addprefix -j ,\$(segment_load_list)) \${RTOS_SOURCE_IMAGE} \${RTOS_LOAD_B};"
49
50 if [ -f "$BOARD_DEFAULT_MAKEFILE" ]; then
51 echo "board default makefile----------------"
52 cp $BOARD_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
53 elif [ -f "$ARCH_DEFAULT_MAKEFILE" ]; then
54 echo "arch default makefile----------------"
55 cp $ARCH_DEFAULT_MAKEFILE $RTOS_BUILD_DIR/build_system/scatter_load.mk
56 else
57 echo "auto generate makefile----------------"
58 echo -e "${FIX_PART_STRING}${SEGMENT_LOAD_LIST}${GENERATE_TARGET}" >$RTOS_BUILD_DIR/build_system/scatter_load.mk
59 fi
60}
shijie.xiong6760c482022-10-19 14:56:28 +080061
62#Parse object file segment information
63function parse_segment_information() {
shijie.xiongf562bd92023-10-20 14:13:46 +080064 if [ "$ARCH" = "xtensa" ]; then
65 TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text' | sort -u | uniq)
66 DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data' | sort -u | uniq)
67 RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata' | sort -u | uniq)
68 BSS_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.bss' | sort -u | uniq)
69 else
70 TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text[^ ]*' | sort -u | uniq)
71 DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data[^ ]*' | sort -u | uniq)
72 RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata[^ ]*' | sort -u | uniq)
73 BSS_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.bss[^ ]*' | sort -u | uniq)
74 fi
75
shijie.xiong6760c482022-10-19 14:56:28 +080076 TEXT_ARRY=(${TEXT_SECTION// /})
77 DATA_ARRY=(${DATA_SECTION// /})
78 RODATA_ARRY=(${RODATA_SECTION// /})
shijie.xiongf562bd92023-10-20 14:13:46 +080079 BSS_SECTION=(${BSS_SECTION// /})
shijie.xiong6760c482022-10-19 14:56:28 +080080}
81
82#Replace the target file segment name
83function rename_target_file_segment() {
shijie.xiong26895eb2023-10-09 11:28:08 +080084
shijie.xiong6760c482022-10-19 14:56:28 +080085 RELINK_FLAG="-p"
shijie.xiong26895eb2023-10-09 11:28:08 +080086
shijie.xiong6760c482022-10-19 14:56:28 +080087 for value in ${TEXT_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080088 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080089 done
90
91 for value in ${DATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080092 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080093 done
94
95 for value in ${RODATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080096 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080097 done
98
shijie.xiongf562bd92023-10-20 14:13:46 +080099 if [ "$ARCH" = "xtensa" ]; then
100 for value in ${BSS_SECTION[@]}; do
101 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
102 done
103 fi
104
shijie.xiong26895eb2023-10-09 11:28:08 +0800105 if [ "$RELINK_FLAG" != "-p" ]; then
106 ${OBJCOPY} ${RELINK_FLAG} $1 $1
107 fi
shijie.xiong6760c482022-10-19 14:56:28 +0800108}
109
shijie.xiong26895eb2023-10-09 11:28:08 +0800110#Search and process target files in the specified directory.
111function search_and_process_specified_directory() {
112
113 OBJ_FILES=$(find $1 -type f -name "*.obj")
114
115 for file in $OBJ_FILES; do
116 parse_segment_information $file
117 rename_target_file_segment $file
118 done
119}
120
121function show_help() {
122 echo -e "\033[41;33m Notice: Invalid parameters, please refer to the following examples. \033[0m"
123 echo -e "\e[1;35m [example]\e[0m"
124 echo " (1) Rename static library section names to default name(.late)."
125 echo " $0 example.a"
126 echo " (2) Rename static library section names to specified names(.sram)."
127 echo " $0 example.a sram"
128 echo " (3) Rename program section names of target files in the specified directory."
129 echo " $0 /example/obj"
130 echo " (4) Rename the section names of target files in the specified directory to the specified names."
131 echo " $0 /example/obj sram"
shijie.xiong6760c482022-10-19 14:56:28 +0800132 exit 1
shijie.xiong26895eb2023-10-09 11:28:08 +0800133}
134
135generate_segment_name $2
136generate_segment_rule_file
137
138if [ -s "$1" ] && [ -f "$1" ]; then
shijie.xiong6760c482022-10-19 14:56:28 +0800139 parse_segment_information $1
140 rename_target_file_segment $1
shijie.xiong26895eb2023-10-09 11:28:08 +0800141elif [ -d "$1" ]; then
142 search_and_process_specified_directory $1
143else
144 show_help
145 exit 1
shijie.xiong6760c482022-10-19 14:56:28 +0800146fi