blob: 654ebefd03172beb66daf77f77a832fe69adf2fc [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.xiong26895eb2023-10-09 11:28:08 +080064 TEXT_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.text[^ ]*' | sort -u | uniq)
65 DATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.data[^ ]*' | sort -u | uniq)
66 RODATA_SECTION=$(${OBJDUMP} -h $1 | grep -wo '\.rodata[^ ]*' | sort -u | uniq)
shijie.xiong6760c482022-10-19 14:56:28 +080067 TEXT_ARRY=(${TEXT_SECTION// /})
68 DATA_ARRY=(${DATA_SECTION// /})
69 RODATA_ARRY=(${RODATA_SECTION// /})
70}
71
72#Replace the target file segment name
73function rename_target_file_segment() {
shijie.xiong26895eb2023-10-09 11:28:08 +080074
shijie.xiong6760c482022-10-19 14:56:28 +080075 RELINK_FLAG="-p"
shijie.xiong26895eb2023-10-09 11:28:08 +080076
shijie.xiong6760c482022-10-19 14:56:28 +080077 for value in ${TEXT_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080078 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080079 done
80
81 for value in ${DATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080082 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080083 done
84
85 for value in ${RODATA_ARRY[@]}; do
shijie.xiong26895eb2023-10-09 11:28:08 +080086 RELINK_FLAG="${RELINK_FLAG}"" --rename-section ${value}=.${SEGMENT_PREFIX}${value}"
shijie.xiong6760c482022-10-19 14:56:28 +080087 done
88
shijie.xiong26895eb2023-10-09 11:28:08 +080089 if [ "$RELINK_FLAG" != "-p" ]; then
90 ${OBJCOPY} ${RELINK_FLAG} $1 $1
91 fi
shijie.xiong6760c482022-10-19 14:56:28 +080092}
93
shijie.xiong26895eb2023-10-09 11:28:08 +080094#Search and process target files in the specified directory.
95function search_and_process_specified_directory() {
96
97 OBJ_FILES=$(find $1 -type f -name "*.obj")
98
99 for file in $OBJ_FILES; do
100 parse_segment_information $file
101 rename_target_file_segment $file
102 done
103}
104
105function show_help() {
106 echo -e "\033[41;33m Notice: Invalid parameters, please refer to the following examples. \033[0m"
107 echo -e "\e[1;35m [example]\e[0m"
108 echo " (1) Rename static library section names to default name(.late)."
109 echo " $0 example.a"
110 echo " (2) Rename static library section names to specified names(.sram)."
111 echo " $0 example.a sram"
112 echo " (3) Rename program section names of target files in the specified directory."
113 echo " $0 /example/obj"
114 echo " (4) Rename the section names of target files in the specified directory to the specified names."
115 echo " $0 /example/obj sram"
shijie.xiong6760c482022-10-19 14:56:28 +0800116 exit 1
shijie.xiong26895eb2023-10-09 11:28:08 +0800117}
118
119generate_segment_name $2
120generate_segment_rule_file
121
122if [ -s "$1" ] && [ -f "$1" ]; then
shijie.xiong6760c482022-10-19 14:56:28 +0800123 parse_segment_information $1
124 rename_target_file_segment $1
shijie.xiong26895eb2023-10-09 11:28:08 +0800125elif [ -d "$1" ]; then
126 search_and_process_specified_directory $1
127else
128 show_help
129 exit 1
shijie.xiong6760c482022-10-19 14:56:28 +0800130fi