[tor-commits] [Git][tpo/applications/tor-browser-build][main] 7 commits: Bug 41137: add the linux-aarch64 targets and improve linux-cross

Pier Angelo Vendrame (@pierov) git at gitlab.torproject.org
Thu May 9 09:37:44 UTC 2024



Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build


Commits:
08c95509 by NoisyCoil at 2024-05-08T15:40:26+02:00
Bug 41137: add the linux-aarch64 targets and improve linux-cross

- - - - -
9c8ed4d1 by NoisyCoil at 2024-05-08T15:43:49+02:00
Bug 41137: '--add-architecture' in containers only when actually cross-compiling

Mainly so that the container's id, which is also determined by 'pre',
does not change if we call the project with 'linux-cross' but don't
actually need to cross-compile.

- - - - -
e53ab0d3 by NoisyCoil at 2024-05-08T15:44:51+02:00
Bug 41137: Define distdir and filename for cross-binutils

- - - - -
af937966 by NoisyCoil at 2024-05-08T15:46:09+02:00
Bug 41137: Separate gcc and gcc-cross

Use stretch's glibc and stretch-security's linux to maintain
compatibility with Debian stretch, add linux-aarch64 glibc patches to
avoid build failures

- - - - -
db06f569 by NoisyCoil at 2024-05-08T15:49:12+02:00
Bug 41137: Add the linux-aarch64 target to OpenSSL

- - - - -
da1663bd by NoisyCoil at 2024-05-09T11:17:19+02:00
Bug 41137: Add the linux-{aarch64,arm} targets to Tor

- - - - -
06de89a5 by NoisyCoil at 2024-05-09T11:17:19+02:00
Bug 41137: Add the linux-{aarch64,arm} targets to Go

- - - - -


16 changed files:

- projects/binutils/build
- projects/binutils/config
- projects/container-image/config
- + projects/gcc-cross/build
- + projects/gcc-cross/config
- + projects/gcc-cross/gcc-cross.patch
- + projects/gcc-cross/glibc-cross-linux-aarch64-2.patch
- + projects/gcc-cross/glibc-cross-linux-aarch64.patch
- projects/gcc/build
- projects/gcc/config
- projects/go-bootstrap/config
- projects/go/config
- projects/openssl/config
- projects/tor/build
- projects/tor/config
- rbm.conf


Changes:

=====================================
projects/binutils/build
=====================================
@@ -1,7 +1,7 @@
 #!/bin/bash
 [% c("var/set_default_env") -%]
 mkdir /var/tmp/dist
-distdir=/var/tmp/dist/binutils
+distdir=/var/tmp/dist/[% c("var/distdir") %]
 [% IF c("var/linux"); GET c("var/set_hardened_build_flags"); END %]
 
 tar xf [% project %]-[% c("version") %].tar.xz
@@ -15,6 +15,6 @@ make install MAKEINFO=true
 
 cd /var/tmp/dist
 [% c('tar', {
-        tar_src => [ project ],
+        tar_src => [ c('var/distdir') ],
         tar_args => '-caf ' _ dest_dir _ '/' _ c('filename'),
         }) %]


=====================================
projects/binutils/config
=====================================
@@ -1,9 +1,10 @@
 # vim: filetype=yaml sw=2
 version: 2.39
-filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
+filename: '[% project %]-[% c("version") %]-[% IF c("var/linux-cross") %]cross-[% c("arch") %]-[% END %][% c("var/build_id") %].tar.[% c("compress_tar") %]'
 container:
   use_container: 1
 var:
+  distdir: binutils
   configure_opt: '--disable-multilib --enable-gold --enable-deterministic-archives --enable-plugins'
 
 targets:
@@ -12,6 +13,7 @@ targets:
       configure_opt: '--target=[% c("arch") %]-w64-mingw32 --disable-multilib --enable-deterministic-archives'
   linux-cross:
     var:
+      distdir: 'binutils-cross-[% c("arch") %]'
       # gold is disabled on cross-compiles until we upgrade to glibc 2.26 and
       # binutils 2.28
       configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-deterministic-archives --enable-plugins'


=====================================
projects/container-image/config
=====================================
@@ -34,7 +34,7 @@ pre: |
   apt-get update -y -q
   [% IF pc(c('origin_project'), 'var/pre_pkginst', { step => c('origin_step') }) -%]
     [% pc(c('origin_project'), 'var/pre_pkginst', { step => c('origin_step') }) %]
-    [% IF c("var/linux-cross") -%]
+    [% IF c("var/linux-cross") && ! pc(c('origin_project'), 'var/no_crosscompile', { step => c('origin_step') }) -%]
       dpkg --add-architecture [% c("var/arch_debian") %]
     [% END -%]
     # Update the package cache again because `pre_pkginst` may change the


=====================================
projects/gcc-cross/build
=====================================
@@ -0,0 +1,96 @@
+#!/bin/sh
+[% c("var/set_default_env") -%]
+mkdir -p /var/tmp/build
+distdir=/var/tmp/dist/[% c("var/distdir") %]
+
+# Install native gcc
+mkdir /var/tmp/dist
+cd /var/tmp/dist
+tar xf $rootdir/[% c('input_files_by_name/gcc-native') %]
+export PATH="$distdir/bin:$PATH"
+
+# Install cross binutils (needed for cross-compiling)
+cd /var/tmp/dist
+tar xf $rootdir/[% c('input_files_by_name/binutils') %]
+rsync -a binutils-cross-[% c("arch") %]/* $distdir
+rm -rf binutils-cross-[% c("arch") %]
+
+# Install Linux headers, see Step 2 of
+# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
+# Doing this before gcc configure is intended to solve a limits.h issue
+cd /var/tmp/build
+mkdir linux
+cd linux
+tar -xJf $rootdir/linux-[% c("var/linux_version") %].tar.xz
+cd linux-[% c("var/linux_version") %]
+make ARCH=[% IF c("arch") == "aarch64" %]arm64[% ELSE %][% c("arch") %][% END %] INSTALL_HDR_PATH=$distdir/[% c("var/crosstarget") %] headers_install
+
+cd /var/tmp/build
+mkdir gcc-cross
+cd gcc-cross
+tar -xJf $rootdir/[% c('input_files_by_name/gcc') %]
+cd gcc-[% c("version") %]
+patch -p1 <$rootdir/gcc-cross.patch
+
+cd /var/tmp/build/gcc-cross
+gcc-[% c("version") %]/configure --prefix=$distdir --includedir=$distdir/[% c("var/crosstarget") %]/include [% c("var/configure_opt") %]
+
+# For cross-compiling to work, we need to partially build GCC, then build
+# glibc, then come back to finish GCC.
+
+# Build only the components of GCC that don't need glibc, see Step 3 of
+# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
+cd /var/tmp/build/gcc-cross
+make -j[% c("num_procs") %] all-gcc
+make install-gcc
+
+# Build glibc headers and startup files, see Step 4 of
+# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
+cd /var/tmp/build
+mkdir glibc
+cd glibc
+tar -xJf $rootdir/glibc-[% c("var/glibc_version") %].tar.xz
+[% IF c("var/linux-aarch64") -%]
+  # Avoid linking issues by backporting glibc patches
+  cd glibc-[% c("var/glibc_version") %]
+  patch -p1 <$rootdir/glibc-cross-linux-aarch64.patch
+  patch -p1 <$rootdir/glibc-cross-linux-aarch64-2.patch
+  cd /var/tmp/build/glibc
+[% END -%]
+
+# TODO: Remove --disable-werror once glibc is upgraded to a version that's
+# designed to work with the GCC version we're using.
+glibc-[% c("var/glibc_version") %]/configure --prefix=$distdir/[% c("var/crosstarget") %] --build=$MACHTYPE --host=[% c("var/crosstarget") %] --target=[% c("var/crosstarget") %] --with-headers=$distdir/[% c("var/crosstarget") %]/include --disable-multilib --disable-werror libc_cv_forced_unwind=yes
+make install-bootstrap-headers=yes install-headers
+make -j[% c("num_procs") %] csu/subdir_lib
+install csu/crt1.o csu/crti.o csu/crtn.o $distdir/[% c("var/crosstarget") %]/lib
+[% c("var/crosstarget") %]-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $distdir/[% c("var/crosstarget") %]/lib/libc.so
+# stdio_lim.h is intended to solve a limits.h issue
+touch $distdir/[% c("var/crosstarget") %]/include/gnu/stubs.h $distdir/[% c("var/crosstarget") %]/include/bits/stdio_lim.h
+
+# Build compiler support library, see Step 5 of
+# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
+cd /var/tmp/build/gcc-cross
+make -j[% c("num_procs") %] all-target-libgcc
+make install-target-libgcc
+
+# finish building glibc, see Step 6 of
+# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
+cd /var/tmp/build/glibc
+make -j[% c("num_procs") %]
+make install
+
+# We're done with glibc, we can now finish building gcc...
+cd /var/tmp/build/gcc-cross
+make -j[% c("num_procs") %]
+make install
+
+# Include a working version of limits.h
+cd gcc-[% c("version") %]
+cat gcc/limitx.h gcc/glimits.h gcc/limity.h >$distdir/lib/gcc/[% c("var/crosstarget") %]/[% c("version") %]/include/limits.h
+
+cd /var/tmp/dist
+[% c('tar', {
+        tar_src => [ c('var/distdir') ],
+        tar_args => '-caf ' _ dest_dir _ '/' _ c('filename'),
+        }) %]


=====================================
projects/gcc-cross/config
=====================================
@@ -0,0 +1,53 @@
+# vim: filetype=yaml sw=2
+filename: '[% project %]-[% c("version") %]-[% c("arch") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
+# Note: When updating the gcc version, if this includes a libstdc++
+# ABI change we should also update projects/firefox/abicheck.cc to
+# require the new version.
+version: '[% pc("gcc-source", "version") %]'
+container:
+  use_container: 1
+hardened_gcc: 1
+var:
+  distdir: gcc
+  deps:
+    - build-essential
+    - libmpc-dev
+  setup: |
+    mkdir -p /var/tmp/dist
+    tar -C /var/tmp/dist -xf $rootdir/[% c("compiler_tarfile") %]
+    export PATH="/var/tmp/dist/[% c("var/distdir") %]/bin:$PATH"
+    export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32
+    [% IF c("hardened_gcc"); GET c("var/set_hardened_build_flags"); END %]
+  configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-languages=c,c++ --with-glibc-version=[% c("var/glibc_version") %]'
+  # Use stretch's glibc and stretch-security's linux
+  glibc_version: 2.24
+  linux_version: 4.19.232
+  arch_deps:
+    - libc6-dev-i386
+    - gawk
+    - rsync
+
+targets:
+  linux-arm:
+    var:
+      configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-languages=c,c++ --with-glibc-version=[% c("var/glibc_version") %] --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb'
+
+input_files:
+  - project: container-image
+  - project: gcc-source
+    name: gcc
+  - name: binutils
+    project: binutils
+    target_prepend:
+      - linux-cross
+  - name: gcc-native
+    project: gcc
+  - URL: 'https://ftp.gnu.org/gnu/glibc/glibc-[% c("var/glibc_version") %].tar.xz'
+    sha256sum: 99d4a3e8efd144d71488e478f62587578c0f4e1fa0b4eed47ee3d4975ebeb5d3
+  - URL: 'https://www.kernel.org/pub/linux/kernel/v4.x/linux-[% c("var/linux_version") %].tar.xz'
+    sha256sum: 4fcfe814780d63dc56e907bf41596ff162e9601978bdc1a60eab64cc3903a22c
+  - filename: 'gcc-cross.patch'
+  - filename: 'glibc-cross-linux-aarch64.patch'
+    enable: '[% c("var/linux-aarch64") -%]'
+  - filename: 'glibc-cross-linux-aarch64-2.patch'
+    enable: '[% c("var/linux-aarch64") -%]'


=====================================
projects/gcc-cross/gcc-cross.patch
=====================================
@@ -0,0 +1,18 @@
+Avoids "../../../gcc-10.3.0/libsanitizer/asan/asan_linux.cpp:217:21: error:
+'PATH_MAX' was not declared in this scope". PATH_MAX is in /include/linux/limits.h,
+which is usually included by /include/limits.h (indirectly, through posix headers,
+etc.). For some reason, when cross-compiling, this inclusion chain is broken and
+we must include <linux/limits.h> by hand.
+
+Index: gcc-10.3.0/libsanitizer/asan/asan_linux.cpp
+===================================================================
+--- gcc-10.3.0.orig/libsanitizer/asan/asan_linux.cpp
++++ gcc-10.3.0/libsanitizer/asan/asan_linux.cpp
+@@ -32,6 +32,7 @@
+ #include <dlfcn.h>
+ #include <fcntl.h>
+ #include <limits.h>
++#include <linux/limits.h>
+ #include <pthread.h>
+ #include <stdio.h>
+ #include <unistd.h>


=====================================
projects/gcc-cross/glibc-cross-linux-aarch64-2.patch
=====================================
@@ -0,0 +1,30 @@
+From e9177fba13549a8e2a6232f46080e5c6d3e467b1 Mon Sep 17 00:00:00 2001
+From: Szabolcs Nagy <szabolcs.nagy at arm.com>
+Date: Wed, 21 Jun 2017 13:47:07 +0100
+Subject: [PATCH] [AArch64] Use hidden __GI__dl_argv in rtld startup code
+
+We rely on the symbol being locally defined so using extern symbol
+is not correct and the linker may complain about the relocations.
+---
+ ChangeLog                    | 5 +++++
+ sysdeps/aarch64/dl-machine.h | 4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+Index: glibc/sysdeps/aarch64/dl-machine.h
+===================================================================
+--- glibc.orig/sysdeps/aarch64/dl-machine.h
++++ glibc/sysdeps/aarch64/dl-machine.h
+@@ -172,8 +172,8 @@ _dl_start_user:							\n\
+ 	cmp	x0, #0						\n\
+ 	bne	1b						\n\
+ 	// Update _dl_argv					\n\
+-	adrp	x3, _dl_argv					\n\
+-	str	x2, [x3, #:lo12:_dl_argv]			\n\
++	adrp	x3, __GI__dl_argv				\n\
++	str	x2, [x3, #:lo12:__GI__dl_argv]			\n\
+ .L_done_stack_adjust:						\n\
+ 	// compute envp						\n\
+ 	add	x3, x2, x1, lsl #3				\n\
+-- 
+2.43.2
+


=====================================
projects/gcc-cross/glibc-cross-linux-aarch64.patch
=====================================
@@ -0,0 +1,63 @@
+From a68ba2f3cd3cbe32c1f31e13c20ed13487727b32 Mon Sep 17 00:00:00 2001
+From: Szabolcs Nagy <szabolcs.nagy at arm.com>
+Date: Wed, 18 Oct 2017 17:26:23 +0100
+Subject: [PATCH] [AARCH64] Rewrite elf_machine_load_address using _DYNAMIC
+ symbol
+
+This patch rewrites aarch64 elf_machine_load_address to use special _DYNAMIC
+symbol instead of _dl_start.
+
+The static address of _DYNAMIC symbol is stored in the first GOT entry.
+Here is the change which makes this solution work (part of binutils 2.24):
+https://sourceware.org/ml/binutils/2013-06/msg00248.html
+
+i386, x86_64 targets use the same method to do this as well.
+
+The original implementation relies on a trick that R_AARCH64_ABS32 relocation
+being resolved at link time and the static address fits in the 32bits.
+However, in LP64, normally, the address is defined to be 64 bit.
+
+Here is the C version one which should be portable in all cases.
+
+	* sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use
+	_DYNAMIC symbol to calculate load address.
+---
+ ChangeLog                    |  5 +++++
+ sysdeps/aarch64/dl-machine.h | 39 +++++-------------------------------
+ 2 files changed, 10 insertions(+), 34 deletions(-)
+
+Index: glibc-2.26/sysdeps/aarch64/dl-machine.h
+===================================================================
+--- glibc-2.26.orig/sysdeps/aarch64/dl-machine.h
++++ glibc-2.26/sysdeps/aarch64/dl-machine.h
+@@ -51,26 +51,11 @@ elf_machine_load_address (void)
+   /* To figure out the load address we use the definition that for any symbol:
+      dynamic_addr(symbol) = static_addr(symbol) + load_addr
+ 
+-     The choice of symbol is arbitrary. The static address we obtain
+-     by constructing a non GOT reference to the symbol, the dynamic
+-     address of the symbol we compute using adrp/add to compute the
+-     symbol's address relative to the PC.
+-     This depends on 32bit relocations being resolved at link time
+-     and that the static address fits in the 32bits.  */
++    _DYNAMIC sysmbol is used here as its link-time address stored in
++    the special unrelocated first GOT entry.  */
+ 
+-  ElfW(Addr) static_addr;
+-  ElfW(Addr) dynamic_addr;
+-
+-  asm ("					\n"
+-"	adrp	%1, _dl_start;			\n"
+-"	add	%1, %1, #:lo12:_dl_start	\n"
+-"	ldr	%w0, 1f				\n"
+-"	b	2f				\n"
+-"1:						\n"
+-"	.word	_dl_start			\n"
+-"2:						\n"
+-    : "=r" (static_addr),  "=r" (dynamic_addr));
+-  return dynamic_addr - static_addr;
++    extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
++    return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
+ }
+ 
+ /* Set up the loaded object described by L so its unrelocated PLT


=====================================
projects/gcc/build
=====================================
@@ -1,7 +1,8 @@
 #!/bin/sh
 [% c("var/set_default_env") -%]
 mkdir -p /var/tmp/build
-[% IF c("var/linux") && ! c("var/linux-cross") -%]
+
+[% IF c("var/linux") -%]
   # Config options for hardening
   export DEB_BUILD_HARDENING=1
   # Since r223796 landed on GCC master enforcing PIE breaks GCC compilation.
@@ -19,81 +20,9 @@ mkdir -p /var/tmp/build
 [% END -%]
 distdir=/var/tmp/dist/[% c("var/distdir") %]
 
-[% IF c("var/linux-cross") -%]
-
-  # Install binutils (needed for cross-compiling)
-  mkdir /var/tmp/dist
-  cd /var/tmp/dist
-  tar xf $rootdir/[% c('input_files_by_name/binutils') %]
-  mv binutils $distdir
-  export PATH="$distdir/bin:$PATH"
-
-  # Install Linux headers, see Step 2 of
-  # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
-  # Doing this before gcc configure is intended to solve a limits.h issue
-  cd /var/tmp/build
-  mkdir linux
-  cd linux
-  tar -xJf $rootdir/linux-[% c("var/linux_version") %].tar.xz
-  cd linux-[% c("var/linux_version") %]
-  make ARCH=[% c("arch") %] INSTALL_HDR_PATH=$distdir/[% c("var/crosstarget") %] headers_install
-
-  cd /var/tmp/build
-  mkdir gcc
-  cd gcc
-  tar -xJf $rootdir/[% c('input_files_by_name/gcc') %]
-  # --with-headers is intended to solve a limits.h issue
-  [% project %]-[% c("version") %]/configure --prefix=$distdir --with-headers=$distdir/[% c("var/crosstarget") %]/include/linux [% c("var/configure_opt") %]
-
-  # For cross-compiling to work, we need to partially build GCC, then build
-  # glibc, then come back to finish GCC.
-
-  # Build only the components of GCC that don't need glibc, see Step 3 of
-  # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
-  cd /var/tmp/build/gcc
-  make -j[% c("num_procs") %] all-gcc
-  make install-gcc
-  # Removing sys-include is intended to solve a limits.h issue
-  rm --recursive --force $distdir/[% c("var/crosstarget") %]/sys-include
-
-  # Build glibc headers and startup files, see Step 4 of
-  # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
-  cd /var/tmp/build
-  mkdir glibc
-  cd glibc
-  tar -xJf $rootdir/glibc-[% c("var/glibc_version") %].tar.xz
-  # TODO: Remove --disable-werror once glibc is upgraded to a version that's
-  # designed to work with the GCC version we're using.
-  glibc-[% c("var/glibc_version") %]/configure --prefix=$distdir/[% c("var/crosstarget") %] --build=$MACHTYPE --host=[% c("var/crosstarget") %] --target=[% c("var/crosstarget") %] --with-headers=$distdir/[% c("var/crosstarget") %]/include --disable-multilib --disable-werror libc_cv_forced_unwind=yes
-  make install-bootstrap-headers=yes install-headers
-  make -j[% c("num_procs") %] csu/subdir_lib
-  install csu/crt1.o csu/crti.o csu/crtn.o $distdir/[% c("var/crosstarget") %]/lib
-  [% c("var/crosstarget") %]-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $distdir/[% c("var/crosstarget") %]/lib/libc.so
-  # stdio_lim.h is intended to solve a limits.h issue
-  touch $distdir/[% c("var/crosstarget") %]/include/gnu/stubs.h $distdir/[% c("var/crosstarget") %]/include/bits/stdio_lim.h
-
-  # Build compiler support library, see Step 5 of
-  # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
-  cd /var/tmp/build/gcc
-  make -j[% c("num_procs") %] all-target-libgcc
-  make install-target-libgcc
-
-  # finish building glibc, see Step 6 of
-  # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
-  cd /var/tmp/build/glibc
-  make -j[% c("num_procs") %]
-  make install
-
-  # We're done with glibc, we can now finish building gcc...
-  cd /var/tmp/build/gcc
-
-[% ELSE -%]
-
-  tar -C /var/tmp/build -xf $rootdir/[% c('input_files_by_name/gcc') %]
-  cd /var/tmp/build/[% project %]-[% c("version") %]
-  ./configure --prefix=$distdir [% c("var/configure_opt") %]
-
-[% END -%]
+tar -C /var/tmp/build -xf $rootdir/[% c('input_files_by_name/gcc') %]
+cd /var/tmp/build/[% project %]-[% c("version") %]
+./configure --prefix=$distdir [% c("var/configure_opt") %]
 
 make -j[% c("num_procs") %]
 make install


=====================================
projects/gcc/config
=====================================
@@ -1,5 +1,5 @@
 # vim: filetype=yaml sw=2
-filename: '[% project %]-[% c("version") %]-[% IF c("var/linux-cross") %][% c("var/osname") %][% ELSE %]x86[% END %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
+filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
 # Note: When updating the gcc version, if this includes a libstdc++
 # ABI change we should also update projects/firefox/abicheck.cc to
 # require the new version.
@@ -7,6 +7,7 @@ version: '[% pc("gcc-source", "version") %]'
 container:
   use_container: 1
 var:
+  no_crosscompile: 1
   distdir: gcc
   deps:
     - build-essential
@@ -15,9 +16,7 @@ var:
     mkdir -p /var/tmp/dist
     tar -C /var/tmp/dist -xf $rootdir/[% c("compiler_tarfile") %]
     export PATH="/var/tmp/dist/[% c("var/distdir") %]/bin:$PATH"
-    [% IF ! c("var/linux-cross") -%]
-      export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32
-    [% END -%]
+    export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32
     [% IF c("hardened_gcc"); GET c("var/set_hardened_build_flags"); END %]
 
 targets:
@@ -33,33 +32,8 @@ targets:
       configure_opt: --enable-multilib --enable-languages=c,c++ --with-arch_32=i686
       arch_deps:
         - libc6-dev-i386
-  linux-cross:
-    var:
-      target_prefix: '[% c("var/crosstarget") %]-'
-      distdir: gcc-cross
-      # TODO: Consider upgrading to a glibc that works out of the box with the
-      # GCC version we use. However, removing our glibc version workarounds may
-      # not be desirable since we want to be able to easily bump the GCC
-      # version without worrying about linux-cross breakage.
-      glibc_version: 2.26
-      linux_version: 4.10.1
-      arch_deps:
-        - libc6-dev-i386
-        - gawk
-  linux-arm:
-    var:
-      configure_opt: --disable-multilib --enable-languages=c,c++ --target=arm-linux-gnueabihf --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb
 
 input_files:
   - project: container-image
   - project: gcc-source
     name: gcc
-  - name: binutils
-    project: binutils
-    enable: '[% c("var/linux-cross") -%]'
-  - URL: 'https://ftp.gnu.org/gnu/glibc/glibc-[% c("var/glibc_version") %].tar.xz'
-    sha256sum: e54e0a934cd2bc94429be79da5e9385898d2306b9eaf3c92d5a77af96190f6bd
-    enable: '[% c("var/linux-cross") -%]'
-  - URL: 'https://www.kernel.org/pub/linux/kernel/v4.x/linux-[% c("var/linux_version") %].tar.xz'
-    sha256sum: 6ca06bb5faf5f83600d7388bb623dae41df2a257de85ad5d1792e03302bc3543
-    enable: '[% c("var/linux-cross") -%]'


=====================================
projects/go-bootstrap/config
=====================================
@@ -4,6 +4,9 @@ filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("co
 container:
   use_container: 1
 
+var:
+  no_crosscompile: 1
+
 input_files:
   - project: container-image
   - URL: 'https://golang.org/dl/go[% c("version") %].src.tar.gz'


=====================================
projects/go/config
=====================================
@@ -9,6 +9,7 @@ var:
   use_go_1_20: 0
   go_1_21: 1.21.9
   go_1_20: 1.20.14
+  no_crosscompile: 1
   setup: |
     mkdir -p /var/tmp/dist
     tar -C /var/tmp/dist -xf $rootdir/[% c("go_tarfile") %]
@@ -101,6 +102,12 @@ targets:
   linux-i686:
     var:
       GOARCH: 386
+  linux-aarch64:
+    var:
+      GOARCH: arm64
+  linux-arm:
+    var:
+      GOARCH: arm
   android:
     var:
       GOOS: android


=====================================
projects/openssl/config
=====================================
@@ -14,6 +14,9 @@ targets:
   linux-i686:
     var:
       configure_opts: -shared linux-x86
+  linux-aarch64:
+    var:
+      configure_opts: -shared --cross-compile-prefix=[% c("var/crosstarget") %]- enable-ec_nistp_64_gcc_128 linux-aarch64
   linux-arm:
     var:
       configure_opts: -shared --cross-compile-prefix=[% c("var/crosstarget") %]- linux-armv4


=====================================
projects/tor/build
=====================================
@@ -21,6 +21,20 @@ mkdir $TORBINDIR
 [% IF c("var/windows") || c("var/android") %]
   tar -C /var/tmp/dist -xf [% c('input_files_by_name/zlib') %]
   zlibdir=/var/tmp/dist/zlib
+[% ELSIF c("var/linux-cross") %]
+  # Since 1. we are using Debian's zlib1g-dev:$arch_debian, 2. our
+  # cross-toolchain's default paths (i.e. -I and -L) are not the same
+  # as those of Debian's cross-toolchain, and 3. tor's configure does
+  # not support separate header and library directories for zlib, we
+  # need to make the headers and $arch_debian library available to
+  # configure manually.
+  # DO NOT use CPPFLAGS="-I/usr/include" to include the headers, the
+  # build will fail (probably because some of our cross-$arch_debian
+  # headers get masked by the native ones).
+  CROSS_INCLUDEDIR=/var/tmp/dist/gcc/[% c("var/crosstarget") %]/include
+  ln -s /usr/include/zconf.h $CROSS_INCLUDEDIR
+  ln -s /usr/include/zlib.h $CROSS_INCLUDEDIR
+  export LDFLAGS="-L/usr/lib/[% c("var/crosstarget") %] $LDFLAGS"
 [% END %]
 [% IF c("var/android") %]
   tar -C /var/tmp/dist -xf [% c('input_files_by_name/zstd') %]
@@ -44,10 +58,14 @@ openssldir=/var/tmp/dist/openssl
   # LD_LIBRARY_PATH value to the Tor Browser with the newer one. Thus, we copy
   # the libstdc++ into the directory with the libs tor depends on, too. See bug
   # 13359 for further details.
-  cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.6 "$TORBINDIR"
+  libdir=[% c("var/libdir") %]
+  [% IF c("var/linux-cross") -%]
+    libdir="[% c("var/crosstarget") %]/$libdir"
+  [% END -%]
+  cp "/var/tmp/dist/gcc/$libdir/libstdc++.so.6" "$TORBINDIR"
   [% IF c("var/asan") -%]
-    cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.6 "$TORBINDIR"
-    cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.1 "$TORBINDIR"
+    cp "/var/tmp/dist/gcc/$libdir/libasan.so.6" "$TORBINDIR"
+    cp "/var/tmp/dist/gcc/$libdir/libubsan.so.1" "$TORBINDIR"
   [% END -%]
   chmod 700 "$TORBINDIR"/*.so*
   # This is needed to make RPATH unavailable. See bug 9150.
@@ -73,6 +91,7 @@ find -type f -print0 | xargs -0 [% c("touch") %]
     [% IF c("var/windows") || c("var/android") %]--with-zlib-dir="$zlibdir"[% END %] \
     [% IF c("var/macos") %]--enable-static-openssl[% END %] \
     [% IF c("var/windows") %]--enable-static-libevent --enable-static-openssl --enable-static-zlib[% END %] \
+    [% IF c("var/linux-cross") %]--build=x86_64-linux-gnu[% END %] \
     --enable-gpl --prefix="$distdir" [% c("var/configure_opt") %]
 [% IF c("var/macos") -%]
   export LD_PRELOAD=[% c("var/faketime_path") %]
@@ -103,10 +122,17 @@ cd $distdir
 [% END %]
 
 [% IF c("var/linux") %]
+  [% IF c("var/linux-cross") -%]
+    CROSS_PREFIX=[% c("var/crosstarget") %]-
+  [% END -%]
+
+  OBJCOPY="${CROSS_PREFIX}objcopy"
+  STRIP="${CROSS_PREFIX}strip"
+
   # Strip and generate debuginfo for libs
-  objcopy --only-keep-debug $distdir/bin/tor "$TORDEBUGDIR/tor"
-  install -s $distdir/bin/tor "$TORBINDIR"
-  objcopy --add-gnu-debuglink="$TORDEBUGDIR/tor" "$TORBINDIR/tor"
+  "$OBJCOPY" --only-keep-debug $distdir/bin/tor "$TORDEBUGDIR/tor"
+  install -s --strip-program="$STRIP" $distdir/bin/tor "$TORBINDIR"
+  "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/tor" "$TORBINDIR/tor"
   for i in "$TORBINDIR"/*so*
   do
       LIB=`basename $i`
@@ -116,11 +142,11 @@ cd $distdir
         # treat this the same as the rest (though it seems libstdc++ doesn't come with
         # any useful debug symbols since we don't build it, so maybe we should figure
         # out how to package them
-        strip "$TORBINDIR/$LIB"
+        "$STRIP" "$TORBINDIR/$LIB"
       else
-        objcopy --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB"
-        strip "$TORBINDIR/$LIB"
-        objcopy --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB"
+        "$OBJCOPY" --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB"
+        "$STRIP" "$TORBINDIR/$LIB"
+        "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB"
       fi
   done
 [% END %]


=====================================
projects/tor/config
=====================================
@@ -30,6 +30,17 @@ targets:
       libdir: lib64
       arch_deps:
         - zlib1g-dev
+  linux-aarch64:
+    var:
+      libdir: lib64
+      arch_deps:
+        - zlib1g-dev:arm64
+  linux-arm:
+    var:
+      libdir: lib
+      arch_deps:
+        - zlib1g-dev:armhf
+
   android:
     var:
       configure_opt_project: '--enable-android --enable-static-openssl --enable-static-libevent --enable-zstd --disable-tool-name-check --disable-system-torrc'


=====================================
rbm.conf
=====================================
@@ -468,14 +468,29 @@ targets:
     - linux-i686
     - linux
     - basebrowser
+  torbrowser-linux-aarch64:
+    - linux-cross
+    - linux-aarch64
+    - linux
+    - torbrowser
+  basebrowser-linux-aarch64:
+    - linux-cross
+    - linux-aarch64
+    - linux
+    - basebrowser
+  mullvadbrowser-linux-aarch64:
+    - linux-cross
+    - linux-aarch64
+    - linux
+    - mullvadbrowser
   torbrowser-linux-arm:
-    - linux-arm
     - linux-cross
+    - linux-arm
     - linux
     - torbrowser
   basebrowser-linux-arm:
-    - linux-arm
     - linux-cross
+    - linux-arm
     - linux
     - basebrowser
   linux-x86_64:
@@ -493,18 +508,26 @@ targets:
       linux-cross: 0
       configure_opt: '--host=i686-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 [% c("var/configure_opt_project") %]'
       arch_debian: i386
+  linux-aarch64:
+    arch: aarch64
+    var:
+      linux-aarch64: 1
+      osname: linux-aarch64
+      linux-cross: 1
+      arch_debian: arm64
+      crosstarget: aarch64-linux-gnu
   linux-arm:
     arch: arm
     var:
       linux-arm: 1
       osname: linux-arm
-      crosstarget: arm-linux-gnueabihf
+      linux-cross: 1
       arch_debian: armhf
+      crosstarget: arm-linux-gnueabihf
   linux-cross:
     var:
       linux-cross: 1
-      container:
-        arch: amd64
+      compiler: 'gcc[% IF ! c("var/no_crosscompile") %]-cross[% END %]'
       configure_opt: '--host=[% c("var/crosstarget") %] [% c("var/configure_opt_project") %]'
   linux:
     # tar in strech does not know how to extract tar.zst files



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/6a0180aeba61b86d3fedb93127c21aa990a6a0e9...06de89a5988038d1ae9e1b8deddc572bf8ba9f85

-- 
This project does not include diff previews in email notifications.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/6a0180aeba61b86d3fedb93127c21aa990a6a0e9...06de89a5988038d1ae9e1b8deddc572bf8ba9f85
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tor-commits/attachments/20240509/5fb111d2/attachment-0001.htm>


More information about the tor-commits mailing list