cmpsc 311 introduction to systems programming module
play

CMPSC 311- Introduction to Systems Programming Module: Build - PowerPoint PPT Presentation

CMPSC 311- Introduction to Systems Programming Module: Build Processing Professor Patrick McDaniel Fall 2016 CMPSC 311 - Introduction to Systems Programming UNIX Pipes Pipes | are ways of redirecting the output of one command to


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

  2. 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 CMPSC 311 - Introduction to Systems Programming Page

  3. 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 CMPSC 311 - Introduction to Systems Programming Page

  4. 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 CMPSC 311 - Introduction to Systems Programming Page

  5. 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 CMPSC 311 - Introduction to Systems Programming Page

  6. 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 CMPSC 311 - Introduction to Systems Programming Page

  7. What is a “static” library? • A library is a collection of Program related code and functions LINKER that are “linked” against a <printf?> Program C program. libc ‣ The library “exports ” “ symbols ” open() { … } ‣ You program object code has write() { … } printf() { … } “ unresolved symbols ” in the code ‣ 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 CMPSC 311 - Introduction to Systems Programming Page

  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 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 CMPSC 311 - Introduction to Systems Programming Page

  9. 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 R - replace existing code with the objects passed libraries are named lib???.a , e.g., C - create the library if needed S - create an index for “relocatable code” 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 ) 9 CMPSC 311 - Introduction to Systems Programming Page

  10. What is a “dynamic” library? • A dynamic library is a Program collection of related code LOADER and functions that are <printf?> Program “resolved” at run time. libc ‣ The library “exports ” “ symbols ” open() { … } ‣ You program object code has write() { … } printf() { … } “ unresolved symbols ” in the code ‣ 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 … CMPSC 311 - Introduction to Systems Programming Page

  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 • 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 CMPSC 311 - Introduction to Systems Programming Page

  12. 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 CMPSC 311 - Introduction to Systems Programming Page

  13. 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 CMPSC 311 - Introduction to Systems Programming Page

  14. #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 CMPSC 311 - Introduction to Systems Programming Page

  15. #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 CMPSC 311 - Introduction to Systems Programming Page

  16. #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 CMPSC 311 - Introduction to Systems Programming Page

Recommend


More recommend