• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2set -e
3readonly script_path=$(cd $(dirname $0);pwd)
4readonly build_path="${script_path}/../../build"
5
6# $1 is target triple, such as `x86_64-unknown-linux-ohos`.
7readonly lib_path="${build_path}/tmp/tarball/rust-std/$1/image/lib/rustlib/$1/lib"
8
9for file in $(find "${lib_path}" -name "lib*.*")
10do
11    dir_name=${file%/*}
12    file_name=${file##*/}
13    file_prefix=$(echo "$file_name" | awk '{split($1, arr, "."); print arr[1]}')
14    file_suffix=$(echo "$file_name" | awk '{split($1, arr, "."); print arr[2]}')
15
16    # Get filename without metadata-id.
17    file_prefix=$(echo "$file_prefix" | awk '{split($1, arr, "-"); print arr[1]}')
18
19    if [[ "$file_suffix" != "rlib" && "$file_suffix" != "so" || \
20          "$file_prefix" == "librustc_demangle" || "$file_prefix" == "libcfg_if" || \
21          "$file_prefix" == "libunwind" ]]
22    then
23        continue
24    fi
25    if [[ "$file_suffix" == "rlib" ]]
26    then
27        if [[ "$file_prefix" == "libstd" || "$file_prefix" == "libtest" ]]
28        then
29            # Add '.dylib' for `libstd` and `libtest`.
30            newfile_name="$file_prefix.dylib.rlib"
31        else
32            newfile_name="$file_prefix.rlib"
33        fi
34    fi
35
36    # `libstd` and `libtest` have both `so` and `rlib`, the other libs only have `rlib`.
37    if [[ "$file_suffix" == "so" ]]
38    then
39        newfile_name="$file_prefix.dylib.so"
40        if [[ "$file_prefix" == "libtest" ]]
41        then
42            # Modify the dependency of `libtest.dylib.so` from `libstd-{metadata-id}.so`
43            # to `libstd.dylib.so`.
44            readonly dynstr_section_vaddr=$(readelf -S "$file" | grep ".dynstr" | \
45                        awk -F']' '{print $2}' | awk '{print strtonum("0x"$3)}')
46            readonly libstd_str_offset=$(readelf -p .dynstr "$file" | \
47                        grep "libstd-[a-z0-9]\{16\}\.so" | awk -F'[' '{print $2}' | \
48                        awk '{print $1}' | awk -F']' '{print strtonum("0x"$1)}')
49            readonly libstd_str_vaddr=`expr $dynstr_section_vaddr + $libstd_str_offset`
50            $(printf 'libstd.dylib.so\0\0\0\0\0\0\0\0\0\0\0' | \
51                dd of="$file" bs=1 seek=$libstd_str_vaddr count=26 conv=notrunc)
52        fi
53    fi
54
55    if [[ "$file_name" == "$newfile_name" ]]
56    then
57        continue
58    fi
59
60    mv $file "$dir_name/$newfile_name"
61done
62