¿Cómo pasa cgo las opciones -Wall -Wl,–dynamic-linker=/system/bin/linker?
Cuando se utiliza arm-linux-gnueabi-gcc para compilar cruzado, GOOS solo admite Linux y no admite Android.
CGO_ENABLED=1 CGO_CFLAGS CC=arm-linux-gnueabi-gcc GOOS=linux GOARCH=arm go build -o hello .
Después de compilar, se genera el archivo hello.
file hello
hello: ejecutable ELF de 32 bits, ARM, versión EABI5 1 (SYSV), enlazado dinámicamente, intérprete /lib/ld-linux.so.3, BuildID[sha1]=038c80350b7a0c9e72b10021c66c31c2dbb4df2c, para GNU/Linux 3.2.0, no está despojado
Como puedes ver, el archivo de salida hello es “dynamically linked, interpreter /lib/ld-linux.so.3”. No se puede ejecutar en la plataforma Android.
./hello
/system/bin/sh: ./hello: No existe el archivo o el directorio
En Android, el intérprete debería ser “/system/bin/linker”. Mi pregunta es: ¿cómo especificar el intérprete dinámico con cgo?
Según mi búsqueda en aquí, gcc tiene parámetros como gcc -o test test.c -Wall -Wl,--dynamic-linker=/system/bin/linker
.
davy.ai
Para especificar el enlazador dinámico utilizando cgo, puedes pasar las banderas del enlazador usando la variable LDFLAGS en el siguiente formato:
Esto pasará la bandera
-Wl,--dynamic-linker=/system/bin/linker
al enlazador externo (-linkmode=external
) utilizado por cgo durante el proceso de construcción.Después de compilar el ejecutable, puedes comprobar el enlazador dinámico usando el comando
readelf
:Esto debería mostrar
[Requesting program interpreter: /system/bin/linker]
.