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 construir un programa CGO con enlace estático a glibc y enlace dinámico a libGL.so?

Mi sistema operativo es Kali, ejecutando GLIBC 2.32. Necesito construir una aplicación CGO para un sistema debian 10, que está ejecutando GLIBC 2.28.

Si ejecuto “go build” con enlace dinámico, no se puede ejecutar en el sistema debian, muestra una incompatibilidad con GLIBC:

versión `GLIBC_2.29` no encontrada
versión `GLIBCXX_3.4.29` no encontrada
versión `GLIBC_2.32` no encontrada

Así que intenté el enlace estático: “CGO_LDFLAGS=’-static’ go build”. Una biblioteca de interfaz gráfica utiliza OpenGL y muestra el siguiente error:

github.com/go-gl/gl/v3.2-core/gl

/usr/bin/ld: no se puede encontrar -lGL

Después de buscar un rato, encontré que la librería libGL está relacionada con el controlador de la GPU y no se puede enlazar estáticamente.

Luego intenté enlazar libGL.so de forma dinámica y enlazar otras bibliotecas de forma estática mediante el siguiente comando:

CGO_LDFLAGS='-L/usr/lib/x86_64-linux-gnu -Bdynamic -lGL -static' go build

Pero obtuve el mismo error: “no se puede encontrar -lGL”.

No quiero usar Docker, es demasiado pesado. Y no creo que actualizar de debian 10 a 11 resuelva el problema, ya que puede haber otros clientes que ejecuten sistemas operativos diferentes en el futuro. ¿Cuál es la mejor solución?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en go, opengl, glibc, cgo, la mejor solución sería utilizar la compilación cruzada para construir la aplicación CGO para el sistema debian 10. Esto garantizará que la aplicación se construya utilizando la versión de GLIBC compatible con el sistema objetivo. Además, la compilación cruzada permitirá la vinculación estática de las bibliotecas necesarias sin ningún problema de compatibilidad.

    Para realizar la compilación cruzada, será necesario instalar las herramientas requeridas y configurar las variables de entorno adecuadamente. En este caso, deberá instalar la cadena de herramientas de debian 10 y establecer las variables de entorno CGO_ENABLED, GOARCH y GOOS según corresponda.

    Por ejemplo, puede ejecutar el siguiente comando para construir la aplicación CGO para debian 10:

    CGO_ENABLED=1 GOARCH=amd64 GOOS=linux CC=x86_64-linux-gnu-gcc CGO_LDFLAGS="-static-libgcc -static-libstdc++ -L/usr/lib/x86_64-linux-gnu -Bdynamic -lGL" go build

    Este comando establece las variables de entorno para la compilación cruzada, especifica la cadena de herramientas a utilizar y proporciona las banderas adecuadas para la vinculación estática y dinámica de bibliotecas, incluyendo libGL.

    Al utilizar la compilación cruzada, podrá construir la aplicación CGO para el sistema objetivo necesario sin problemas de compatibilidad y sin la necesidad de un contenedor de Docker o actualizar el sistema objetivo.

Comments are closed.