Ambiente de Desenvolvimento de Programas Walter Fetter Lages w.fetter@ieee.org Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Engenharia Elétrica Programa de Pós-Graduação em Engenharia Elétrica ELE00002 Sistemas de Automação Copyright (c) Walter Fetter Lages p.1
Tópicos Editor de Textos Compilador Montador Linker Linkagem Incremental Linkagem Estática Linkagem Dinâmica Make Gerenciador de Bibliotecas Depurador Ambiente Integrado de Desenvolvimento Copyright (c) Walter Fetter Lages p.2
Introdução Linguagem de máquina Assembly Montador Compilador Sistema Host Sistema Target Copyright (c) Walter Fetter Lages p.3
Editor de Textos Produz o arquivo fonte (.c,.pas,.java,.cpp,... ) MS-DOS Editor (edit) Windows notepad (notepad) Norton Editor (ne) Brief (brief) Windows Programmer s Editor (wpe) Joe s Own Editor (joe) Visual Editor (vi) VI Improoved (vim) KDE Text Editor (kedit) Editor of Macros (emacs) Copyright (c) Walter Fetter Lages p.4
Compilador Traduz os módulos fonte para outra linguagem (.asm,.s) ou para módulos objeto (.obj,.o) Microsoft C (cc) Turbo Pascal (tpc) Turbo C++ (tcc) Borland C++ (bcc) GNU Compiler Collection (gcc, g++, g77, gjc,... ) Copyright (c) Walter Fetter Lages p.5
Montador Traduz os módulos fonte em Assembly (.asm,.s) para módulos objeto (.obj,.o) Microsoft Macro Assembler (ml, masm) Turbo Assembler (tasm) GNU Assembler (as) Netwide Assembler (nasm) Copyright (c) Walter Fetter Lages p.6
Linker Liga os diversos módulos objeto (.obj,.o) para criar: um programa executável, ou um módulo maior, ou uma biblioteca de linkagem dinâmica As referências internas são resolvidas Microsoft Linker (link) Turbo Linker (tlink) GNU Linker (ld, collect2) Copyright (c) Walter Fetter Lages p.7
Gerenciador de Bibliotecas Agrupa diversos módulos objeto (.obj,.o) em um arquivo de biblioteca (.lib,.a) As referências internas não são resolvidas A unidade de linkagem é o módulo objeto Microsoft Library Manager (lib) Turbo Library Manager (tlib) GNU Archive (ar) Copyright (c) Walter Fetter Lages p.8
Depurador debug Codeview (cv) Turbo Debugger (td) GNU Debuger (gdb) Front-ends (xxgdb, kdbg) Copyright (c) Walter Fetter Lages p.9
Linkagem Incremental Diversos módulos objeto são ligados para formar um módulo objeto maior São resolvidas as referências internas Copyright (c) Walter Fetter Lages p.10
Linkagem Estática Um ou mais módulos são ligados para criar um programa executável (.exe) ou imagem binária (.com) Podem ser ligados módulos em sí ou módulos contidos em bibliotecas estáticas Cada programa tem a sua própria copia dos módulos objeto (.obj,.o) Copyright (c) Walter Fetter Lages p.11
Linkagem Dinâmica Bibliotecas dinâmicas (.dll,.so) não são ligadas com o programa pelo linker Carregada pelo sistema operacional Compartilhada por todos os programas que usam a biblioteca dinâmica Copyright (c) Walter Fetter Lages p.12
Make Programa para automatizar e otimizar o processo de compilação e linkagem Executa apenas os procedimentos que são necessários Funciona baseado na comparação das datas e horas dos arquivos Makefile = Arquivo interpretado pelo make Microsoft Program Maintenance Utility (make, nmake) Borland Make (make) GNU Make (make) Copyright (c) Walter Fetter Lages p.13
IDE Editor, Compilador, Linker, Make,... integrados Alguns podem ser configurados para utilizar diversos compiladores, linkers,... Microsoft Visual C (msc) Turbo Pascal (turbo) Borland C++ (bc) Windows Programmer s Editor (wpe) KDE Development Environment (kdevelop) Copyright (c) Walter Fetter Lages p.14
Exemplo 1 Hello, World! em C hello.c Makefile Copyright (c) Walter Fetter Lages p.15
hello.c #include <stdio.h> int main(int argc,char *argv[]) { printf("hello, world!\n"); return 0; } Copyright (c) Walter Fetter Lages p.16
Makefile CFLAGS=-O2 -Wall CINCLUDE=-I. -I${HOME}/include CLIBDIR=-L${HOME}/lib CLIBS= CPPFLAGS= CPPINCLUDE=-I${HOME}/include/cpp -I../include CPPLIBDIR=-L../lib CPPLIBS= INCLUDE=${CINCLUDE} ${CPPINCLUDE} FLAGS= ${CFLAGS} ${CPPFLAGS} LIBDIR=${CLIBDIR} ${CPPLIBDIR} LIBS=${CPPLIBS} ${CLIBS} CMP= gcc CMPFLAGS= ${FLAGS} ${INCLUDE} LDFLAGS= ${LIBDIR} ${LIBS} Copyright (c) Walter Fetter Lages p.17
Makefile Continuação all: hello hello: hello.c ${CMP} ${CMPFLAGS} -o $@ $^ ${LDFLAGS} clean: rm -f *~ *.bak *.o install: distclean: clean rm -f hello Copyright (c) Walter Fetter Lages p.18
Exemplo 2 Hello, World! em C++ hello.cpp Makefile Copyright (c) Walter Fetter Lages p.19
hello.cpp #include <iostream> int main(int argc,char *argv[]) { cout << "Hello, world!\n"; return 0; } Copyright (c) Walter Fetter Lages p.20
Makefile CFLAGS=-O2 -Wall CINCLUDE=-I. -I${HOME}/include CLIBDIR=-L${HOME}/lib CLIBS= CPPFLAGS= CPPINCLUDE=-I${HOME}/include/cpp -I../include CPPLIBDIR=-L../lib CPPLIBS= INCLUDE=${CINCLUDE} ${CPPINCLUDE} FLAGS= ${CFLAGS} ${CPPFLAGS} LIBDIR=${CLIBDIR} ${CPPLIBDIR} LIBS=${CPPLIBS} ${CLIBS} CMP= g++ CMPFLAGS= ${FLAGS} ${INCLUDE} LDFLAGS= ${LIBDIR} ${LIBS} Copyright (c) Walter Fetter Lages p.21
Makefile Continuação all: hello hello: hello.cpp ${CMP} ${CMPFLAGS} -o $@ $^ ${LDFLAGS} clean: rm -f *~ *.bak *.o install: distclean: clean rm -f hello Copyright (c) Walter Fetter Lages p.22
Exemplo 3 Hello, World! em Assembly Utiliza serviço do Linux para mostrar string Sintaxe do gas hello.s Makefile Copyright (c) Walter Fetter Lages p.23
hello.s.intel_syntax noprefix _start:.text.global _start mov edx,offset len mov ecx,offset msg mov ebx,1 mov eax,4 int 0x80 # 3rd arg. string length # 2nd arg. pointer to string # 1st arg. file handle (stdout) # system call number (sys_write) # call kernel xor ebx,ebx mov eax,1 int 0x80 # 1st arg. exit code # system call number (sys_write) # call kernel msg: len=.data.string "Hello, world!\n". - msg Copyright (c) Walter Fetter Lages p.24
Makefile ASMFLAGS=-a=hello.lst --gstabs -n --32 INCLUDE= FLAGS=${ASMFLAGS} LIBDIR= LIBS= LD=ld CMP=as CMPFLAGS=${FLAGS} ${INCLUDE} LDFLAGS=-m elf_i386 Copyright (c) Walter Fetter Lages p.25
Makefile Continuação all: hello hello: hello.o ${LD} ${LDFLAGS} -o $@ ${LIBS} $^ hello.o: hello.s ${CMP} ${CMPFLAGS} -o $@ $^ clean: rm -f *~ *.bak *.o install: distclean: clean rm -f hello *.lst *.map.kdbgrc.* Copyright (c) Walter Fetter Lages p.26
Referências [1] S. Chamberlain and I. L. Taylor. Using ld, the GNU Linker, 2003. <http://sourceware.org/binutils/docs>. [2] D. Elsner, J. Fenlason, and friends. Using as, the GNU Assembler, 2002. <http://sourceware.org/binutils/docs>. [3] R. H. Pesch, J. M. Osier, and Cygnus Support. The GNU Binary Utilities, 1993. <http://sourceware.org/binutils/docs>. [4] R. M. Stallman, R. McGrath, and P. Smith. GNU Make, A Program for Directing Recompilation. Boston, 2002. <http://www.gnu.org/software/make/manual/make.pdf>. [5] R. M. Stallman, R. Pesch, S. Shebs, and etal. Debugging with GDB, The GNU Source-Level Debugger. Boston, 2002. <http://sourceware.org/gdb/current/onlinedocs/gdb.pdf [6] R. M. Stallman and The GCC Developer Community. Using the GNU Compiler Collection, 2004. <http://gcc.gnu.org/onlinedocs/gcc>. Copyright (c) Walter Fetter Lages p.27