Modify external toolchain scripts `PREFIX-ar and `PREFIX-ranlib
to handle object files compiled with LTO enabled; and simplify
external toolchain scripts `PREFIX-gcc-ar and `PREFIX-gcc-ranlib
to avoid failing to create static library archives.

Signed-off-by: Ye Holmes <yehol...@outlook.com>
---
Using external prebuilt gcc toolchain, fails to create valid
static libraries via `PREFIX-ar tool due to LTO compilation
flag, which a number of packages has enabled, for example:

aarch64-none-linux-gnu-ar: CMakeFiles/ubusd_library.dir/ubusd.c.o:
  plugin needed to handle lto object
aarch64-none-linux-gnu-ranlib: libubusd_library.a(ubusd.c.o):
  plugin needed to handle lto object
[ 70%] Linking C executable ubusd
  openwrt/tmp/ubusd.lX2qbV.ltrans0.ltrans.o: in function `ubus_msg_dequeue':
  ubus-2020-12-04-d1d9ddf9/ubusd_main.c:32:
  undefined reference to `ubus_msg_free'

One possible solution is to force the `PREFIX-ar script to invoke
`PREFIX-gcc-ar (and `PREFIX-gcc-ranlib) unconditionally:
$ cat ./staging_dir/PREFIX/bin/aarch64-none-linux-gnu-ar
exec "/path/to/external/toolchain/aarch64-none-linux-gnu-gcc-ar" "$@"

Another problem with `PREFIX-gcc-ar and `PREFIX-gcc-ranlib is that they
have too many unnecessary options in the generated scripts, so that
they essentially does not work properly:

aarch64-none-linux-gnu-gcc-ar cr hostapd_multi.a LIST-OBJECTS.o:
aarch64-none-linux-gnu/bin/ar: two different operation options specified

A tested solution is to simplify `PREFIX-gcc-ar and `PREFIX-gcc-ranlib
scripts, the result is that `PREFIX-ar and `PREFIX-gcc-ar are identical,
while `PREFIX-ranlib and `PREFIX-gcc-ranlib scripts are identical, too.
---
 scripts/ext-toolchain.sh | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/scripts/ext-toolchain.sh b/scripts/ext-toolchain.sh
index ee7d9532f5..27c168789a 100755
--- a/scripts/ext-toolchain.sh
+++ b/scripts/ext-toolchain.sh
@@ -198,6 +198,33 @@ find_bins() {
        return 1
 }
 
+wrap_bin_ar() {
+       local out="$1"
+       local bin="$2"
+
+       echo '#!/bin/sh'                                                   > 
"$out"
+       if [[ "$bin" =~ .+gcc-ar$ ]] ; then
+               echo 'exec "'"$bin"'" "$@"'                                   
>> "$out"
+       else
+               echo 'exec "'"${bin%-ar}-gcc-ar"'" "$@"'                      
>> "$out"
+       fi
+
+       chmod +x "$out"
+}
+
+wrap_bin_ranlib() {
+       local out="$1"
+       local bin="$2"
+
+       echo '#!/bin/sh'                                                   > 
"$out"
+       if [[ "$bin" =~ .+gcc-ranlib$ ]] ; then
+               echo 'exec "'"$bin"'" "$@"'                                   
>> "$out"
+       else
+               echo 'exec "'"${bin%-ranlib}-gcc-ranlib"'" "$@"'              
>> "$out"
+       fi
+
+       chmod +x "$out"
+}
 
 wrap_bin_cc() {
        local out="$1"
@@ -256,6 +283,12 @@ wrap_bins() {
                                fi
 
                                case "${cmd##*/}" in
+                                       *-ar)
+                                               wrap_bin_ar "$out" "$bin"
+                                       ;;
+                                       *-ranlib)
+                                               wrap_bin_ranlib "$out" "$bin"
+                                       ;;
                                        *-*cc|*-*cc-*|*-*++|*-*++-*|*-cpp)
                                                wrap_bin_cc "$out" "$bin"
                                        ;;
-- 
2.25.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to