Compilación cruzada de la cadena de herramientas de GDB

1. Compilación cruzada

La compilación cruzada se refiere a la compilación de un programa en una plataforma para ejecutarlo en otra plataforma. La plataforma aquí involucra hardware y software, la plataforma de hardware se refiere a la arquitectura de la CPU y la plataforma de software se refiere al sistema operativo. La compilación cruzada está dirigida principalmente al campo integrado. Dado que los recursos del sistema integrado son limitados, no hay forma de ejecutar un conjunto de entornos de compilación en la plataforma integrada. Por lo tanto, es necesario utilizar la cadena de herramientas de compilación cruzada en otras plataformas con un mayor rendimiento para hacer que los programas se ejecuten en la plataforma.

Los pasos básicos de la compilación cruzada son los mismos que los de la compilación ordinaria:

[1] configure las configuraciones
antes de compilar. Si el parámetro --host es diferente del parámetro --build, es una compilación cruzada. De lo contrario, es una compilación normal.
[2] Hacer
compilación. De acuerdo con los parámetros generados por la configuración configure en el paso anterior, llame a la cadena de herramientas de compilación correspondiente para compilar y generar el programa de destino.
[3] Realice la instalación de
instalación. Instale el programa de destino generado por make en el directorio especificado. Si no ejecuta make install, puede copiar manualmente al directorio especificado.

1.1 --build --host --target

Eche un vistazo a la definición de los tres parámetros --build, --host y --target en el paso de configuración. A continuación, ejecute './ configure --help' en el directorio fuente de gdb

./configure --help
System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]

El código fuente se compila para generar un programa ejecutable. De acuerdo con la plataforma en la cual se realiza la operación de compilación, la plataforma de ejecución del programa ejecutable, y la plataforma de procesamiento del programa ejecutable, la operación de compilación se puede dividir en múltiples tipos, y los correspondientes los tres parámetros de configuración son los siguientes:
- -build : la plataforma en la que se ejecuta la cadena de herramientas de compilación, que es la plataforma en la que se realiza la operación de compilación. Si no se especifica este parámetro, se adivinará mediante config.guess. Por lo general, este parámetro no se especifica.

--host : la plataforma en la que se ejecutará el programa ejecutable. Si no se especifica este parámetro, es lo mismo que --build. Si --host y --build son diferentes, es una compilación cruzada; de lo contrario, es una compilación normal.

--target : La plataforma que manejará el programa ejecutable. Si no se especifica este parámetro, es lo mismo que --host. En términos generales, en qué plataforma se ejecuta el programa, en qué plataforma se está procesando. Este valor de parámetro es el mismo que el parámetro --host y no necesita ser especificado explícitamente, por lo que generalmente no se le presta atención a este parámetro. Pero en el caso especial de hacer herramientas de compilación cruzada (como gcc, gdb, etc.), este valor es diferente de --host, por ejemplo, el compilador cruzado arm-linux-gcc, que se ejecuta en x86- plataforma linux (parámetro --host), pero se trata de la plataforma arm-linux (parámetro --target). Si realiza una compilación cruzada de una aplicación normal, como un programa tftp que se ejecuta en la plataforma arm-linux, su plataforma en ejecución y su plataforma de procesamiento son ambas plataformas arm-linux.

1.2 Tres tipos de compilación

Los tipos de compilación se pueden dividir en tres tipos, que se reflejan principalmente en diferentes parámetros de configuración en la fase de configuración: (Suponiendo que la cadena de herramientas de compilación cruzada está instalada en la plataforma x86-linux, y la plataforma incrustada de destino que se compilará es la plataforma arm-linux, esto es solo para ilustrar la intención (el nombre de la plataforma no es riguroso)

[1] Compilar programas ordinarios para plataforma de PC
Generalmente, se ejecutan los siguientes comandos de configuración:

./configure

Completar los parámetros predeterminados es en realidad equivalente al siguiente comando:

./configure --build=x86_linux --host=x86_linux --target=x86_linux

[2] Compilar la
cadena de herramientas de compilación cruzada Lo especial de la cadena de herramientas de compilación cruzada es que se ejecuta en la plataforma x86-linux pero se ocupa de la plataforma arm-linux. No es necesario utilizar la compilación cruzada para hacer una cadena de herramientas de compilación cruzada. Generalmente, ejecute los siguientes comandos de configuración:

./configure --target=arm_linux

Completar los parámetros predeterminados es en realidad equivalente al siguiente comando:

./configure --build=x86_linux --host=x86_linux --target=arm_linux

[3] Compilación cruzada de programas de plataforma integrada La compilación cruzada
es necesaria para generar programas de plataforma integrada. Generalmente, ejecute los siguientes comandos de configuración:

./configure --host=arm_linux CC=arm-linux-gcc

Completar los parámetros predeterminados es en realidad equivalente al siguiente comando:

./configure --build=x86_linux --host=arm_linux --target=arm_linux CC=arm-linux-gcc

De hecho, si queremos hacer herramientas de compilación que se ejecuten en plataformas embebidas (como gcc, gdb, etc.), también podemos ejecutar el comando configure anterior y luego ejecutar make, pero las herramientas generadas como gcc, gdb, etc. .básicamente no se puede utilizar en la plataforma incrustada de destino Debido a que el hardware no se puede mover, la cadena de herramientas del compilador de la plataforma incrustada se hace según el método en [2], no según el método en [3].

2. Ejemplos de uso y compilación cruzada de GDB

Cuando use GDB en una plataforma integrada, se usará el modo de depuración remota de GDB: ejecute el programa que se depurará a través de gdbserver en la placa de destino, ejecute gdb en la computadora host y pase 'destino remoto [ip]: [puerto]' Para conectarse al gdbserver en la placa de destino para iniciar la depuración remota. Se ingresan varios comandos de depuración en la computadora host y el efecto de ejecución del programa (incluida la impresión) se muestra en la placa de destino. Esto es fácil de entender, porque el programa que se está depurando se ejecuta originalmente en la placa de destino. No ejecute gdb directamente en la placa de destino para la depuración porque la configuración de hardware de la placa de destino es baja y no se puede ejecutar gdb. Por supuesto, algunas plataformas integradas tienen un alto rendimiento y pueden ejecutar gdb normalmente. Cuando el hardware de la plataforma integrada se vuelve cada vez más poderoso, el límite entre la plataforma integrada y la plataforma informática de propósito general se vuelve cada vez más difuso. La situación real es exactamente así, el rendimiento del hardware es cada vez más fuerte, y el problema de la escasez de recursos es cada vez menor. En esta situación de desarrollo, el declive de la tecnología incorporada es un resultado inevitable.

La configuración del entorno de depuración de gdb en la plataforma integrada es muy útil para comprender los tres parámetros --build, --host y --target en el proceso de compilación cruzada anterior.

2.1 Descripción ambiental

Máquina virtual: CPU: x86_64, sistema: openSUSE Leap 42.3, IP: 192.168.202.240
Placa de desarrollo: CPU: mips mt7688, sistema: openwrt linux, IP: 192.168.202.141
El compilador cruzado de C instalado en la máquina virtual es mipsel-openwrt- linux-gcc, el prefijo de la cadena de herramientas de compilación cruzada es mipsel-openwrt-linux.

2.2 Descargar código fuente

Descargue la última versión del código fuente gdb-8.2.tar.gz de ftp://ftp.gnu.org/gnu/gdb y descomprímalo:

[1] tar zxvf ./gdb-8.2.tar.gz
[2] cd gdb-8.2

2.3 Compilar gdb

[1] cd gdb-8.2
[2] ./configure --target=mipsel-openwrt-linux
[3] make

gdb se ejecuta en una máquina virtual, por lo que no requiere compilación cruzada. Los parámetros --build y --host se dejan en blanco y los parámetros de la plataforma de la máquina virtual se utilizan realmente. Aunque gdb se ejecuta en una máquina virtual, procesa los programas de la plataforma de la placa de desarrollo, así que especifique --target como mipsel-openwrt-linux, y el valor es el prefijo de la cadena de herramientas de compilación cruzada.

2.4 Compilación cruzada de gdbserver

[1] cd gdb-8.2/gdb/gdbserver
[2] ./configure --host=mipsel-openwrt-linux CC=mipsel-openwrt-linux-gcc
[3] make

gdbserver se ejecuta en la placa de desarrollo, por lo que se requiere una compilación cruzada. Deje el parámetro --build en blanco, el uso real es el parámetro de plataforma de la máquina virtual. El parámetro --host especifica la plataforma de la máquina virtual y el valor es mipsel-openwrt-linux. El parámetro --target se deja en blanco, por lo que su valor será igual al valor del parámetro --host.

2.5 Usar gdb en modo remoto

Placa de desarrollo: la IP de la placa de desarrollo es 192.168.202.141, puede ingresar cualquiera de los siguientes comandos

gdbserver :1234 test
gdbserver 127.0.0.1:1234 test
gdbserver 192.168.202.141:1234 test

Host: primero ejecute la aplicación gdb en la línea de comando SHELL

./gdb

Después de ejecutar el comando anterior, SHELL ingresará al modo gdb. Entre los siguientes comandos, '(gdb)' es el indicador:

(gdb) target remote 192.168.202.141
(gdb) b main.c:55
(gdb) c

El primer comando anterior es conectarse de forma remota al servidor gdb en la placa de desarrollo. Después de conectarse, se usa normalmente. El segundo comando es establecer un punto de interrupción. El tercer comando es ejecutar el programa. Tenga en cuenta que el programa que se va a depurar se está ejecutando en la placa de desarrollo, así que use el comando 'c' en lugar del comando 'r'. Si ingresa el comando 'r', puede ver el indicador remoto El modo no admite el comando 'r':

(gdb) r
The "remote" target does not support "run".  Try "help target" or "continue".

3. Problemas heredados

Durante el proceso de compilación cruzada, el prefijo de la cadena de herramientas de compilación cruzada se usa generalmente como el valor de --host y --target; el parámetro --build generalmente no se especifica y se adivina automáticamente durante la compilación. Todos estos son en un nivel práctico. Generalmente, incluso si están escritos incorrectamente, eventualmente se compilarán después de algunos intentos. Para la definición de la descripción de la plataforma, es decir, las reglas de valor específicas para los valores de --build, --host y --target, no encontré la fuente ni la definición oficiales. Sí, no encontré en línea.

4. ./configurar -build, -host, -target 设置

1. Compilación: el host que ejecuta la compilación del código, normalmente su sistema host. Este parámetro generalmente lo adivina config.guess. Por supuesto, puede especificarlo usted mismo.

2. Host: El host donde se ejecuta el programa binario compilado, porque la mayor parte se ejecuta localmente si se compila localmente. Entonces este valor es igual a construir. Solo cuando la compilación cruzada (es decir, compilando localmente y ejecutándose en otras máquinas del sistema) será diferente del host. Utilice host para especificar el host en ejecución.

3. Destino: esta opción solo se utiliza cuando se configura un entorno de compilación cruzada, ni compilación normal ni compilación cruzada. Utiliza el compilador en el host de compilación para compilar un nuevo compilador (binutils, gcc, gdb, etc.), y otros programas compilados por este nuevo compilador en el futuro se ejecutarán en el sistema especificado por el objetivo.

4. Tomemos el ejemplo de compilar gcc:

1) 命令 : ./ configurar --build = powerpc-linux --host = powerpc-linux --target = powerpc-linux ' 

Nota: Use el compilador powerpc-linux (--build) para compilar gcc. El gcc compilado se ejecuta en powerpc-linux (--host). Este gcc se usa para compilar y ejecutar en el código powerpc-linux (--target).

Rol: Por supuesto, nadie usará esta opción para compilar gcc.

2) 命令 : ./ configurar --build = i386-linux --host = powerpc-linux --target = powerpc-linux

Descripción: Use el compilador i386-linux (--build) para compilar gcc, el gcc compilado se ejecuta en powerpc-linux (--host), este gcc se usa para compilar y puede ejecutarse en el código powerpc-linux (--target) .

Función: esta opción se puede utilizar para compilar su compilador para otras máquinas.

3) 命令 : ./ configurar --build = i386-linux --host = i386-linux --target = powerpc-linux

Descripción: Use el compilador i386-linux (- build) para compilar gcc, el gcc compilado se ejecuta en i386-linux (- host), este gcc se usa para compilar y puede ejecutarse en el código powerpc-linux (- target) .

Función: Esta opción se utiliza para construir un entorno de compilación cruzada powerpc-linux en el host i386.

4) 命令 : ./ configurar --build = powerpc-linux --host = i386-linux --target = powerpc-linux

Nota: Use el compilador powerpc-linux (--build) para compilar gcc. El gcc compilado se ejecuta en i386-linux (--host). Este gcc se usa para compilar y ejecutar en el código powerpc-linux (--target).

Función: esta opción se puede utilizar para construir un entorno de compilación cruzada POWrpc-linux en el host i386, pero el entorno de compilación cruzada se compila en powerpc-linux y se instala en el host i386-linux. Se estima que no hay mucha gente lo usará así.

En general, solo cuando la compilación host! = Build es una compilación cruzada. De lo contrario, se compila normalmente.

5. Referencias

El entorno de depuración de GDB integrado en Linux establece la
excepción de Python información anormal
Depuración remota de QT de problemas de Python en la placa ARM

Supongo que te gusta

Origin blog.csdn.net/u013318019/article/details/104391632
Recomendado
Clasificación