maven-mvnd icon indicating copy to clipboard operation
maven-mvnd copied to clipboard

Build for Linux on aarch64

Open PMExtra opened this issue 1 year ago • 6 comments

I found some issues and resolved them when building mvnd for Linux on aarch64.

I'm using docker image ubuntu:22.04 on aarch64 machine.

This is my patch:

diff --git a/client/pom.xml b/client/pom.xml
index 679cc23d..3a900043 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -228,6 +228,8 @@
                          -H:-ParseRuntimeOptions
                          -H:+AddAllCharsets
                          -H:+ReportExceptionStackTraces
+                         -H:+TraceNativeToolUsage
+                         -H:PageSize=65536
                          -ea</buildArgs>
             </configuration>
             <executions>
diff --git a/client/src/main/resources/glibc/dynamic-libc-start.c b/client/src/main/resources/glibc/dynamic-libc-start.c
index 2272b255..09097cbc 100644
--- a/client/src/main/resources/glibc/dynamic-libc-start.c
+++ b/client/src/main/resources/glibc/dynamic-libc-start.c
@@ -27,8 +27,8 @@
 #include <dlfcn.h>
 #include <stdint.h>

-__asm__(".symver dlsym,dlsym@GLIBC_2.2.5");
-__asm__(".symver dlvsym,dlvsym@GLIBC_2.2.5");
+__asm__(".symver dlsym,dlsym@GLIBC_2.17");
+__asm__(".symver dlvsym,dlvsym@GLIBC_2.17");

 /* __libc_csu_init is statically linked into each program, and passed to __libc_start_main
  * when the program is running with an old glibc (<2.34).
diff --git a/client/src/main/resources/glibc/glibc.redef b/client/src/main/resources/glibc/glibc.redef
index 10342159..4d330e02 100644
--- a/client/src/main/resources/glibc/glibc.redef
+++ b/client/src/main/resources/glibc/glibc.redef
@@ -15,21 +15,21 @@
 # specific language governing permissions and limitations
 # under the License.
 __libc_start_main __dynamic_libc_start_main
-clock_gettime clock_gettime@GLIBC_2.2.5
-dlopen dlopen@GLIBC_2.2.5
-dlsym dlsym@GLIBC_2.2.5
-memcpy memcpy@GLIBC_2.2.5
-posix_spawn posix_spawn@GLIBC_2.2.5
-pthread_attr_getguardsize pthread_attr_getguardsize@GLIBC_2.2.5
-pthread_attr_getstack pthread_attr_getstack@GLIBC_2.2.5
-pthread_attr_setstacksize pthread_attr_setstacksize@GLIBC_2.2.5
-pthread_condattr_setclock pthread_condattr_setclock@GLIBC_2.3.3
-pthread_create pthread_create@GLIBC_2.2.5
-pthread_getattr_np pthread_getattr_np@GLIBC_2.2.5
-pthread_join pthread_join@GLIBC_2.2.5
-pthread_kill pthread_kill@GLIBC_2.2.5
-pthread_setname_np pthread_setname_np@GLIBC_2.12
-sem_destroy sem_destroy@GLIBC_2.2.5
-sem_init sem_init@GLIBC_2.2.5
-sem_post sem_post@GLIBC_2.2.5
-sem_wait sem_wait@GLIBC_2.2.5
+clock_gettime clock_gettime@GLIBC_2.17
+dlopen dlopen@GLIBC_2.17
+dlsym dlsym@GLIBC_2.17
+memcpy memcpy@GLIBC_2.17
+posix_spawn posix_spawn@GLIBC_2.17
+pthread_attr_getguardsize pthread_attr_getguardsize@GLIBC_2.17
+pthread_attr_getstack pthread_attr_getstack@GLIBC_2.17
+pthread_attr_setstacksize pthread_attr_setstacksize@GLIBC_2.17
+pthread_condattr_setclock pthread_condattr_setclock@GLIBC_2.17
+pthread_create pthread_create@GLIBC_2.17
+pthread_getattr_np pthread_getattr_np@GLIBC_2.17
+pthread_join pthread_join@GLIBC_2.17
+pthread_kill pthread_kill@GLIBC_2.17
+pthread_setname_np pthread_setname_np@GLIBC_2.17
+sem_destroy sem_destroy@GLIBC_2.17
+sem_init sem_init@GLIBC_2.17
+sem_post sem_post@GLIBC_2.17
+sem_wait sem_wait@GLIBC_2.17

After the patch, it builds successfully and works fine on my machine.

I'm looking forward to the official release of Linux aarch64 pre-built distribution. But until then, this patch may help some people in need, so I share it.

PMExtra avatar Oct 10 '23 08:10 PMExtra

My understanding is that it would go against https://github.com/apache/maven-mvnd/issues/823. Can this patch be adapted to be inlined and only require glibc 2.12 ?

It would be nice to be able to provide native binaries for linux-arm64, but I don't think GitHub action has any runner yet (see https://github.com/actions/runner-images/issues/5631).

gnodet avatar Oct 18 '23 06:10 gnodet

I'm sorry that I do not specialize in native programming. So, I'm unsure if my build only requires [email protected].

But I built the project followed by the official workflow (https://github.com/apache/maven-mvnd/blob/1.0-m7/.github/workflows/release.yaml#L67) which contains #825 that solves #823.

I just replaced all amd64 or x86_64 with aarch64 after this patch.

Then everything was fine, even the Verify native binary for only requiring glibc 2.12 script passed. (https://github.com/apache/maven-mvnd/blob/1.0-m7/.github/workflows/release.yaml#L91).

When I copy the target to another aarch64 machine that runs Kylin-OS (a Linux distribution that seems like CentOS 8), it still works fine.

It is worth mentioning that my PAGE_SIZE is 64k rather than 4k (maybe 4k is more common). So I have to set -H:PageSize=65536. We can get more information from https://github.com/oracle/graal/pull/5605

PMExtra avatar Oct 18 '23 06:10 PMExtra

By the way, I built the project by Docker which runs on my Apple M1 Macbook.

So, can we use the macOS runner to start up a container and then build the project for linux-aarch64?

PMExtra avatar Oct 18 '23 06:10 PMExtra

By the way, I built the project by Docker which runs on my Apple M1 Macbook.

So, can we use the macOS runner to start up a container and then build the project for linux-aarch64?

The mentioned runner is my laptop :-) If you can create a PR that would add provide a script that can generate the linux-aarch64 binaries, I should be able to upload those during the release process (please add the step to https://github.com/apache/maven-mvnd/blob/master/RELEASING.adoc in the PR...)

gnodet avatar Oct 18 '23 07:10 gnodet

I'm sorry that I do not specialize in native programming. So, I'm unsure if my build only requires [email protected].

But I built the project followed by the official workflow (https://github.com/apache/maven-mvnd/blob/1.0-m7/.github/workflows/release.yaml#L67) which contains #825 that solves #823.

I just replaced all amd64 or x86_64 with aarch64 after this patch.

Then everything was fine, even the Verify native binary for only requiring glibc 2.12 script passed. (https://github.com/apache/maven-mvnd/blob/1.0-m7/.github/workflows/release.yaml#L91).

When I copy the target to another aarch64 machine that runs Kylin-OS (a Linux distribution that seems like CentOS 8), it still works fine.

It is worth mentioning that my PAGE_SIZE is 64k rather than 4k (maybe 4k is more common). So I have to set -H:PageSize=65536. We can get more information from oracle/graal#5605

For aarch64 arch, the oldest public released glibc is glibc-2.17 for CentOS7. It is reasonable that we limit the running glibc >= 2.17 on aarch64 cpu. But the resource should be upload for each hardware (x64/arm64). Also the UT in CI could be improved to check dependencies strictly for each arch.

gzm55 avatar Jan 02 '24 06:01 gzm55