Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ASO
Agenda
1 Compilación y enlazado
2 Herramientas de compilación
ASO 2/26
Agenda
1 Compilación y enlazado
2 Herramientas de compilación
ASO 3/26
Compilación y Enlazado
Código fuente C
cc1 fun.c
fun.o
int fun( )
Preprocesador { cc1+as .text
$\ldots$ ejecutable
return local; .data
} .text
Código C modificado gcc
.text
ld
main.c
Compilador .data
main.o
int main( ) .data
{
$\ldots$ cc1+as .text
Código Ensamblador fun();
$\ldots$ .data
as return 0;
}
Ensamblador
Otros ficheros
objeto
Código Objeto Reubicable Bibliotecas
Estáticas
ld
Enlazador
Ejecutable
ASO 4/26
Compilación y Enlazado
Código fuente C
cc1 fun.c
fun.o
int fun( )
Preprocesador { cc1+as .text
$\ldots$ ejecutable
return local; .data
} .text
Código C modificado gcc
.text
ld
main.c
Compilador .data
main.o
int main( ) .data
{
$\ldots$ cc1+as .text
Código Ensamblador fun();
$\ldots$ .data
as return 0;
}
Ensamblador
Otros ficheros
objeto
Código Objeto Reubicable Bibliotecas
Estáticas
ld
Enlazador
Ejecutable
ASO 4/26
Compilación y Enlazado
Código fuente C
cc1 fun.c
fun.o
int fun( )
Preprocesador { cc1+as .text
$\ldots$ ejecutable
return local; .data
} .text
Código C modificado gcc
.text
ld
main.c
Compilador .data
main.o
int main( ) .data
{
$\ldots$ cc1+as .text
Código Ensamblador fun();
$\ldots$ .data
as return 0;
}
Ensamblador
Otros ficheros
objeto
Código Objeto Reubicable Bibliotecas
Estáticas
ld
Enlazador
Ejecutable
ASO 4/26
Compilación y Enlazado
Código fuente C
cc1 fun.c
fun.o
int fun( )
Preprocesador { cc1+as .text
$\ldots$ ejecutable
return local; .data
} .text
Código C modificado gcc
.text
ld
main.c
Compilador .data
main.o
int main( ) .data
{
$\ldots$ cc1+as .text
Código Ensamblador fun();
$\ldots$ .data
as return 0;
}
Ensamblador
Otros ficheros
objeto
Código Objeto Reubicable Bibliotecas
Estáticas
ld
Enlazador
Ejecutable
ASO 4/26
En resumen
ASO 5/26
Veamos un ejemplo (para ARM)
ASO 6/26
Secciones de Datos
ASO 7/26
Tabla de sı́mbolos
ASO 8/26
Relocalización: Opción 1
ASO 9/26
Relocalización: Opción 1
ASO 9/26
Relocalización: Opción 1
ASO 9/26
Relocalización: Opción 2
ASO 10/26
Código definitivo
.global start
.data
X: .word 5
Y: .word 7
.text
start: ldr r1, =X
ldr r1, [r1]
ldr r2, =Y
ldr r2, [r2]
cmp r1, r2
blt L0
add r1, r1, #2
add r2, r2, #2
b L1
L0: sub r1, r1, #2
sub r2, r2, #2
L1: b .
.ltorg @Literales
.end
ASO 11/26
Código definitivo
.global start Compilamos
.data
X: .word 5
# make asm2.o
Y: .word 7
arm-none-eabi-gcc -mcpu=arm1176jzf-s -marm
.text
-mlittle-endian -O0 -g3 -x assembler-with-cpp
start: ldr r1, =X
-c -o asm2.o asm2.S
ldr r1, [r1]
# arm-none-eabi-objdump -D asm2.o
ldr r2, =Y
ldr r2, [r2]
cmp r1, r2
blt L0
add r1, r1, #2
add r2, r2, #2
b L1
L0: sub r1, r1, #2
sub r2, r2, #2
L1: b .
.ltorg @Literales
.end
ASO 11/26
Código definitivo
Desensamblado de la sección .text:
.global start 00000000 <start>:
.data 0: e59f1028 ldr r1, [pc, #40] ; 30 <L1+0x4>
X: .word 5 4: e5911000 ldr r1, [r1]
Y: .word 7 8: e59f2024 ldr r2, [pc, #36] ; 34 <L1+0x8>
.text c: e5922000 ldr r2, [r2]
start: ldr r1, =X 10: e1510002 cmp r1, r2
ldr r1, [r1] 14: ba000002 blt 24 <L0>
ldr r2, =Y 18: e2811002 add r1, r1, #2
ldr r2, [r2] 1c: e2822002 add r2, r2, #2
cmp r1, r2 20: ea000001 b 2c <L1>
blt L0
add r1, r1, #2 00000024 <L0>:
add r2, r2, #2 24: e2411002 sub r1, r1, #2
b L1 28: e2422002 sub r2, r2, #2
L0: sub r1, r1, #2
sub r2, r2, #2 0000002c <L1>:
L1: b . 2c: eafffffe b 2c <L1>
.ltorg @Literales 30: 00000000 .word 0x00000000
.end 34: 00000004 .word 0x00000004
00000004 <Y>:
4: 00000007 andeq r0, r0, r7
ASO 11/26
Estructura de un ejecutable ELF
ASO 12/26
Agenda
1 Compilación y enlazado
2 Herramientas de compilación
ASO 13/26
Flags habituales en gcc
-c
para generar el fichero objeto, no el ejecutable
-o
para indicar el nombre del fichero que se genere
-lnombre para enlazar con la librerı́a libnombre
-Lrutap ara indicar que se busquen librerı́as en ruta
-Iruta
para indicar que se busquen ficheros de cabecera en ruta
-Onpara indicar el nivel de optimización (entre 0 y 3)
-g
para incluir sı́mbolos de depuración en el ejecutable (y
poder depurar con gdb)
-pg para incluir información de instrumentación que permita
realizar profiling con gprof
-Wall para que se generen mensajes de warning en compilación
para todas las construcciones de código que se consideran
cuestionables
-Werror hace que los warnings se tomen como errores
https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
ASO 14/26
Generación de una librerı́a estática
ASO 15/26
Generación de una librerı́a dinámica
Cuestión
¿Para qué sirve el flag -fPIC?
Cuestión
¿Es posible compilar dinámicamente una aplicación en una máquina y eje-
cutarla en otra?
ASO 17/26
Búsqueda de una librerı́a dinámica
Cuestión
¿Y si una librerı́a depende de otra?¿Es posible?¿Debemos indicar todas las
librerı́as en compilación?¿Y si hay dependencias circulares entre librerı́as?
Cuestión
¿Para qué sirve la herramienta ldd?¿Y ldconfig?
ASO 18/26
Carga dinámica explı́cita de código
ASO 19/26
Makefile
Ejemplo
> ls
main.c foo.c faa.c tipos.h
ASO 20/26
Sintaxis de makefile: dependencias
Cuestión
¿Cómo se expresan las dependencias del ejemplo en el fichero makefile?
Más información:
https://www.gnu.org/software/make/manual/html_node/index.html
ASO 21/26
Sintaxis de makefile: reglas
Cuestión
Si quisiéramos compilar manualmente, paso a paso, la aplicación del ejem-
plo, ¿qué comandos de compilación necesaitarı́amos?
Cuestión
Indica qué reglas hay que incluir en el Makefile del ejemplo para que se
genere el ejecutable
ASO 22/26
Sintaxis de makefile: macros
Podemos dar valor a una macro (similar a una variable) escribiendo
NOMBREMACRO=valor
Posteriormente podemos acceder al valor escribiendo
$(NOMBREMACRO) o $NOMBREMACRO
Las macros se pueden definir dentro del propio makefile o en la lı́nea
de comando cuando invocamos make:
make \CC=gcc"
Macros internas. Macros especiales predefinidas.
$? lista de pre-requisitos que más recientes que el objetivo
$@ nombre del objetivo actual
$< nombre de la primera dependencia
$ˆ lista de cada dependencia de la regla
$* nombre del pre-requisito actual, sin ningún sufijo (.c, .o. . . .)
Otros caracteres especiales
- indica a make que ignore los errores y continúe (por ejemplo, si
queremos crear un directorio y ya existe o borrar un fichero que no
existe)
@ indica a make que no imprima el comando en la salida estándar antes
de ejecutarlo
ASO 23/26
Sintaxis de makefile: múltiples objetivos
ASO 24/26
Sintaxis de makefile: múltiples objetivos
CC = gcc
INSTDIR = /usr/local/bin
CFLAGS = -g -Wall -ansi
all: miExec
...
.PHONY : clean
clean:
-rm main.o foo.o faa.o
install: miExec
@if [-d $(INSTDIR) ]; \
then \
cp miExec $(INSTDIR) && \
chmod a+x $(INSTDIR)\miExec && \
echo "Instalado en $(INSTDIR)" ; \
else \
echo "Error: $(INSTDIR) no existe"; false ; \
fi
ASO 25/26
Makefile: reglas implı́citas y reglas patrón
ASO 26/26