CMPSC 311- Introduction to Systems Programming Module: Build Processing

Similar documents
CMPSC 311- Introduction to Systems Programming Module: Build Processing

CS Basics 15) Compiling a C prog.

Berner Fachhochschule Haute cole spcialise bernoise Berne University of Applied Sciences 2

Basic C Programming. Bin Li Assistant Professor Dept. of Electrical, Computer and Biomedical Engineering University of Rhode Island

2 Compiling a C program

Topic 6: A Quick Intro To C. Reading. "goto Considered Harmful" History

Topic 6: A Quick Intro To C

A software view. Computer Systems. The Compilation system. How it works. 1. Preprocesser. 1. Preprocessor (cpp)

KYC - Know your compiler. Introduction to GCC

CS240: Programming in C

The Make Utility. Independent compilation. Large programs are difficult to maintain. Problem solved by breaking the program into separate files

CS 326 Operating Systems C Programming. Greg Benson Department of Computer Science University of San Francisco

INTERMEDIATE SOFTWARE DESIGN SPRING 2011 ACCESS SPECIFIER: SOURCE FILE

Lectures 5-6: Introduction to C

Practical C Issues:! Preprocessor Directives, Multi-file Development, Makefiles. CS449 Fall 2017

Errors During Compilation and Execution Background Information

COSC350 System Software

Intermediate Programming, Spring 2017*

Chapter 7: Preprocessing Directives

G52CPP C++ Programming Lecture 6. Dr Jason Atkin

CS2141 Software Development using C/C++ Compiling a C++ Program

The Make Utility. Independent compilation. Large programs are difficult to maintain. Problem solved by breaking the program into separate files

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 12, FALL 2012

1.1 The hand written header file

Deep C. Multifile projects Getting it running Data types Typecasting Memory management Pointers. CS-343 Operating Systems

PRINCIPLES OF OPERATING SYSTEMS

#include <stdio.h> int main() { printf ("hello class\n"); return 0; }

Makefiles SE 2XA3. Term I, 2018/19

Have examined process Creating program Have developed program Written in C Source code

Compiler, Assembler, and Linker

C: Program Structure. Department of Computer Science College of Engineering Boise State University. September 11, /13

UNIX Makefile. C Project Library Distribution and Installation.

This course has three parts. Elements of C programming. Arithmatic and Error analysis. Some algorithms and their implementation

ENCE Computer Organization and Architecture. Chapter 1. Software Perspective

INDEX. Figure I-0. Listing I-0. Table I-0. Symbols.DIRECTIVE (see Assembler directives)? preprocessor operator 3-34

CAAM 420 Fall 2012 Lecture 15. Roman Schutski

Compiler Theory. (GCC the GNU Compiler Collection) Sandro Spina 2009

CSE 374 Programming Concepts & Tools

CSCI-243 Exam 2 Review February 22, 2015 Presented by the RIT Computer Science Community

Introduction to Supercomputing

A Fast Review of C Essentials Part II

Chapter 11 Introduction to Programming in C

PROGRAMMAZIONE I A.A. 2017/2018

How Compiling and Compilers Work

CS2141 Software Development using C/C++ Libraries

CS5460/6460: Operating Systems. Lecture 21: Shared libraries. Anton Burtsev March, 2014

Beyond this course. Machine code. Readings: CP:AMA 2.1, 15.4

CSE 2421: Systems I Low-Level Programming and Computer Organization. Linking. Presentation N. Introduction to Linkers

C and C++ 2. Functions Preprocessor. Alan Mycroft

The Compilation Process

NEXT SET OF SLIDES FROM DENNIS FREY S FALL 2011 CMSC313.

Lecture 2: C Programming Basic

Miscellaneous C-programming Issues

(Extract from the slides by Terrance E. Boult

Data and File Structures Laboratory

CIT 595 Spring System Software: Programming Tools. Assembly Process Example: First Pass. Assembly Process Example: Second Pass.

Laboratorio di Tecnologie dell'informazione

#include. Practical C Issues: #define. #define Macros. Example. #if

Chapter 11 Introduction to Programming in C

Chapter 11 Introduction to Programming in C

Conduite de Projet Cours 4 The C build process


Modifiers. int foo(int x) { static int y=0; /* value of y is saved */ y = x + y + 7; /* across invocations of foo */ return y; }

Control flow and string example. C and C++ Functions. Function type-system nasties. 2. Functions Preprocessor. Alastair R. Beresford.

An Ungentle Introduction to C

Decision Making -Branching. Class Incharge: S. Sasirekha

2. First C. Algorithm

Workspace for '3-ctips' Page 1 (row 1, column 1)

Rule 1-3: Use white space to break a function into paragraphs. Rule 1-5: Avoid very long statements. Use multiple shorter statements instead.

CSE 374 Programming Concepts & Tools. Brandon Myers Winter 2015 C: Linked list, casts, the rest of the preprocessor (Thanks to Hal Perkins)

C for Engineers and Scientists: An Interpretive Approach. Chapter 7: Preprocessing Directives

Slide Set 5. for ENCM 339 Fall Steve Norman, PhD, PEng. Electrical & Computer Engineering Schulich School of Engineering University of Calgary

CS240: Programming in C. Lecture 2: Overview

Maemo Diablo GNU Make and makefiles Training Material

Introduction to Supercomputing

C Preprocessor. Prabhat Kumar Padhy

Lectures 5-6: Introduction to C

Conditional Compilation

Laboratorio di Programmazione. Prof. Marco Bertini

15213 Recitation Section C

Language Translation. Compilation vs. interpretation. Compilation diagram. Step 1: compile. Step 2: run. compiler. Compiled program. program.

Unit 4 Preprocessor Directives

Essentials for Scientific Computing: Source Code, Compilation and Libraries Day 8

CSE 374 Programming Concepts & Tools

Programs. Function main. C Refresher. CSCI 4061 Introduction to Operating Systems

GDB and Makefile. Bin Li Assistant Professor Dept. of Electrical, Computer and Biomedical Engineering University of Rhode Island

We d like to hear your suggestions for improving our indexes. Send to

independent compilation and Make

JTSK Programming in C II C-Lab II. Lecture 3 & 4

Draft. Chapter 1 Program Structure. 1.1 Introduction. 1.2 The 0s and the 1s. 1.3 Bits and Bytes. 1.4 Representation of Numbers in Memory

M2 Instruction Set Architecture

The make utility automatically determines which pieces of a large program need to be recompiled, and issues commands to recompile them.

What s next. Computer Systems A Programmer s Perspective

Friday, September 16, Lab Notes. Command line arguments More pre-processor options Programs: Finish Program 1, begin Program 2 due next week

Chapter 11 Introduction to Programming in C

Continue: How do I learn C? C Primer Continued (Makefiles, debugging, and more ) Last Time: A Simple(st) C Program 1-hello-world.c!

Chapter 11 Introduction to Programming in C

Link 7.A Static Linking

1 You seek performance 3

CMPSC 311- Introduction to Systems Programming Module: Introduction to C

Transcription:

CMPSC 311- Introduction to Systems Programming Module: Build Processing Professor Patrick McDaniel Fall 2016

UNIX Pipes Pipes are ways of redirecting the output of one command to the input of another Make STDOUT for one program the STDIN for the next For example, mcdaniel@ubuntu:~/siis/courses/cmpsc311-f13/docs/assign/assign2$ cat numbers.txt 313.11 45.64 9.50 113.89 mcdaniel@ubuntu:~/siis/courses/cmpsc311-f13/docs/assign/assign2$ cat numbers.txt sort -n 9.50 45.64 113.89 313.11 mcdaniel@ubuntu:~/siis/courses/cmpsc311-f13/docs/assign/assign2$ UNIX: the cat command prints the content of a file to the terminal. UNIX: the sort sorts the lines of input and prints to the terminal. 2

Assignment #2 trick You can use pipes to test your program more quickly mcdaniel@ubuntu:~/siis/courses/cmpsc311-f13/docs/assign/assign2$ cat inputs.txt./cmpsc311-f13-assign2 ********************************************************************* Received and computed values 9.50 45.64 313.11 113.89 81.56 250.00 11.90 469.98 313.11 4.68 34.33 8013.55-10.15 11.50 88.00 10 46 313 114 82 250 12 470 313 5 34 8014-10 12 88 The largest element of the float array is 8023.75 The largest element of the int array is 8014 ********************************************************************* Altered values... 3

Building a program 101 There are two phases of building a program, compiling and linking gcc is used to build the program ld can be used to link the program (or gcc) 4

Compiling a program You will run a command to compile gcc <source code> [options] Interesting options -c (tells the compiler to just generate the object files) -Wall (tells the compiler to show all warnings) -g (tells the compiler to generate debug information) -o <filename>.o (write output to file) An example gcc hello.c -c -Wall -g -o hello.o 5

Linking a program You will run a command to link gcc <object files> [options] Interesting options -l<lib> (link with a library) -g (tells the compiler to generate debug information) -o <filename> (write output to file) An example, gcc hello.o goodbye.o -g -lmyexample -o hello 6

What is a static library? A library is a collection of related code and functions that are linked against a C program. The library exports symbols You program object code has unresolved symbols in the code Program <printf?> The linker pulls chunks of the library containing those symbols and places them into the program The program is done when all the pieces are resolved Is is called static linking because this is done at link time libc open() { } write() { } printf() { } LINKER Program

Building a static library A statically linked library produces object code that is inserted into program at link time. You are building an archive of the library which the linker uses to search for and transfer code into your program. To run the command, use ar rcs lib<libname>.a <object files> Library naming: with very few exceptions all static libraries are named lib???.a, e.g., ar rcs libmyexample.a a.o b.o c.o d.o You link against the name of the library, not against the name of the file in which the library exists (see linking) 8

Building a static library A statically linked library produces object code that is inserted into program at link time. You are building an archive of the library which the linker uses to search for and transfer code into your program. To run the command, use ar rcs lib<libname>.a <object files> Library R - replace naming: existing with very code few with exceptions the objects all static passed libraries C - create are named the library lib???.a, if needed e.g., S ar - create rcs libmyexample.a an index for relocatable a.o b.o code c.o d.o You link against the name of the library, not against the name of the file in which the library exists (see linking) 9

What is a dynamic library? A dynamic library is a collection of related code and functions that are resolved at run time. The library exports symbols You program object code has unresolved symbols in the code Program <printf?> libc open() { } write() { } printf() { } LOADER The loader pulls chunks of the library containing those symbols and places them into the process The symbols are resolved when the process is started or later during execution Is is called dynamic because it can be done any time Program

Building a dynamic library A dynamically linked library produces object code that is inserted into program at execution time. You are building an loadable versions of the library which the loader uses to launch the application To run the command, pass to gcc using -shared, e.g., gcc -shared -o libmyexample.so a.o b.o c.o d.o Important: all object files to be placed in library must have been compiled to position-independent code (PIC) PIC is not dependent on an placement in memory e.g., always uses relative jumps, so does not matter where it is loaded at execution time Naming: same as before, only with.so extension 11

Building a dynamic library A dynamically linked library produces object code that is inserted into program at execution time. You are building an loadable versions of the library which the loader uses to launch the application To run the command, pass to gcc using -shared, e.g., gcc -shared -o libmyexample.so a.o b.o c.o d.o gcc a.c -fpic -c -Wall -g -o a.o Important: all object files to be placed in library must have been compiled to position-independent code (PIC) PIC is not dependent on an placement in memory e.g., always uses relative jumps, so does not matter where it is loaded at execution time Naming: same as before, only with.so extension 12

The C Preprocessor The preprocessor processes input source code files for commands that setup the compile environment specific to that execution. The programmer uses # directives to indicate what he wants that program to do. We have seen one of these before, #include There are more... 13

#include The #include directive tells the compiler to include data from some other data file. #include foo.h - this tells the compiler to look in the local directory for the include file (used for application programming) #include <foo.h> - tells the compiler to look at the default directories and any provided by the command line. The gcc -I<path> option tells the compiler to look in a specific directory for include files (that are using the <...h> approach) Generally speaking, systems programming uses the <> to have better control over what is being included from where. 14

#define The #define directive allows the user to create a definition symbol that gets search/replaced throughout commonly used to define a constant that might be changed in the future, e.g., the sizes of arrays... The #undef directive undoes this binding #define NUMBER_ENTRIES 15... int main( void ) { // Declare your variables here float myfloats[number_entries]; // Read float values for ( i=0; i<number_entries; i++ ) { scanf( "%f", &myfloats[i] ); } 15

#define macros #define can also be used to create simple functions called macros /* Defining a function to swap pairs of integers */ #define swap(x,y) {int temp=x; x=y; y=temp;} int main( void ) { // Declare your variables here int i = 1, j =2;... swap(i,j); Macros are not called as normal functions, but are replaced during preprocessing (thus no function call overheads) 16

Conditional Compilation You can conditionally compile parts of a program using the #if, #ifdef, and #ifndef directives #define DEFINED... #if 0 /* This does not get compiled */ #else /* This does get compiled */ #endif #ifdef UNKNOWNVALUE /* This does not get compiled */ #else /* This does get compiled */ #endif #ifndef DEFINED /* This does not get compiled */ #else /* This does get compiled */ #endif /* A quick way to comment out code, as typically used in doing debugging and unit testing */ int main( void ) { // Declare your variables here float myfloats[number_entries]; #if 0 // Read float values for ( i=0; i<number_entries; i++ ) { scanf( "%f", &myfloats[i] ); } // Show the list of unsorted values printcharline( '*', 69 ); printf( "Received and computed\n" ); #endif... 17

Make The make utility is a utility for building complex systems/program 1. figure out which parts of system are out of date 2. figure out what the dependencies are between objects 3. issue command to create the intermediate and final project files Note: being a good systems programmer requires mastering the make utility. 18

Make basics Each system you want to build has one (or more) files defining how to build, called the Makefile A Makefile defines the things to build...... the way to build them... and the way they relate Terminology Target - a thing to build Prerequisites - things that the target depends on Dependencies between files, e.g., a.o depends on a.c Variables - data that defines elements of interest to the build Rules - are statements of targets, prerequisites and commands 19

Makefile rules... Also known as a production, a rule defines how a particular item is built. The rule syntax is: (MUST BE TABBED OVER) Where target is thing to be built prereq(1 2 3) are things needed to make the target commands are the UNIX commands to run to make target Key Idea: run the (commands) to build (the target) when (any of the prerequisites are out of date) 20

Rule example Dependency graph 21

What about the object files? Dependency graph 22

Running make To run make, just type make at the UNIX prompt. It will open and interpret the Makefile (or makefile) and build any targets that are out of date Thus... it will look at the dependency graph E.g., consider if I edit support.c... 23

Variables Makefile variables allow you to replace some repetitive (and changing text) with others Some standard variables include: 24

Built-in Variables Make supports a range of special variables that are used while evaluating each rule (called built-ins) Three of the most popular built-ins are $@ is the current rule target $^ is the prerequisite list $< is the first prerequisite Built-ins are used to make builds cleaner... 25

Suffix rules A suffix rule defines a default way to generate a target from a type of prerequisites You only need to define the dependency and not the commands for those files Defining suffix rule: Step 1: define the file types to be in suffix rules (.SUFFIXES) Step 2: define the default productions E.g., 26

Putting it all together... # # Sample Makefile # Variables CC=gcc LINK=gcc CFLAGS=-c -Wall -I. OBJECT_FILES=sample.o support.o # Suffix rules.suffixes:.c.o You will begin to develop a set of patterns for makefiles that you will use repeatedly over time on the different (and increasingly complex) builds. We will explore the use of these over the course of this semester..c.o: $(CC) -c $(CFLAGS) -o $@ $< # Productions sample : $(OBJECT_FILES) $(LINK) $(OBJECT_FILES) -o $@ # Dependancies sample.o : sample.c support.h support.o : support.c support.h % make gcc -c -c -Wall -I. -o sample.o sample.c gcc -c -c -Wall -I. -o support.o support.c gcc sample.o support.o -o sample % 27