es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para especificar el enlazador dinámico utilizando cgo, puedes pasar las banderas del enlazador usando la variable LDFLAGS en el siguiente formato:

    CGO_ENABLED=1 CGO_CFLAGS CC=arm-linux-gnueabi-gcc GOOS=linux GOARCH=arm \
        go build -ldflags="-linkmode=external -extldflags=-Wl,--dynamic-linker=/system/bin/linker" \
        -o hello .
    

    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:

    readelf -l hello | grep interpreter
    

    Esto debería mostrar [Requesting program interpreter: /system/bin/linker].

Comments are closed.