Faculty of Computer Science and Engineering
Ho Chi Minh City University of Technology
CO2018
Operating Systems
C programming
Autumn, 2016
Nguyen Duc Hai
Objective
• Understand how to compile a C project
• Get familiar with Makefile
• Enhance C programing skills
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
2
Compilation
• How to create an executable file from a single source file?
// hello.c
#include <stdio.h>
int main() {
printf(“Hello, world!”);
}
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
3
Compilation
• How to create an executable file from a single source file?
Preprocessor
hello.i
Autumn 2016
// hello.c
#include <stdio.h>
int main() {
printf(“Hello, world!”);
}
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
4
Compilation
• How to create an executable file from a single source file?
Preprocessor
hello.i
// hello.c
#include <stdio.h>
int main() {
printf(“Hello, world!”);
}
Compiler
hello.s
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
5
Compilation
• How to create an executable file from a single source file?
Preprocessor
hello.i
// hello.c
#include <stdio.h>
int main() {
printf(“Hello, world!”);
}
Compiler
hello.s
Autumn 2016
Assembler
hello.o
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
6
Compilation
• How to create an executable file from a single source file?
Preprocessor
hello.i
// hello.c
#include <stdio.h>
int main() {
printf(“Hello, world!”);
}
Compiler
hello.s
Autumn 2016
We need the implementation
of printf from this file
libc.a
Assembler
hello.o
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
Linker
a.out
7
Compilation
• How to create an executable file from multiple source files?
• Suppose we have five files (you can find them in source code directory in Resource
page at Sakai):
•
•
•
•
•
main.c
swap.h
swap.c
rev.h
rev.c
Compile source code first then link all of them together
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
8
Compilation
• How to create an executable file from multiple source files?
main.c
Translators
(cpp, cc1, as)
main.o
Autumn 2016
swap.c
rev.c
Translators
(cpp, cc1, as)
Translators
(cpp, cc1, as)
swap.o
rev.o
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
9
Compilation
• How to create an executable file from multiple source files?
main.c
Translators
(cpp, cc1, as)
main.o
libc.a
Autumn 2016
swap.c
rev.c
Translators
(cpp, cc1, as)
Translators
(cpp, cc1, as)
swap.o
rev.o
Linker (ld)
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
prg
10
Makefile
• How to compile source code efficiently?
• Reduce compilation time
• Portable
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
11
Makefile
• How to compile source code efficiently?
main.c
rev.h
swap.h
prg
rev.c
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
12
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
prg
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
13
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
main.o: main.c rev.h
gcc –c main.c
prg
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
14
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
main.o: main.c rev.h
gcc –c main.c
prg
swap.o: swap.c swap.h
gcc –c swap.c
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
15
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
main.o: main.c rev.h
gcc –c main.c
prg
swap.o: swap.c swap.h
gcc –c swap.c
rev.o: rev.c rev.h swap.h
gcc –c rev.c
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
16
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
swap.c
Autumn 2016
main.o: main.c rev.h
gcc –c main.c
prg
swap.o: swap.c swap.h
gcc –c swap.c
rev.o: rev.c rev.h swap.h
gcc –c rev.c
Change!
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
17
Makefile
• How to compile source code efficiently?
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.c
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
main.o: main.c rev.h
gcc –c main.c
prg
swap.o: swap.c swap.h
gcc –c swap.c
rev.o: rev.c rev.h swap.h
gcc –c rev.c
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
18
Makefile
• How to compile source code efficiently?
main.c
We do not recompile this file because
its dependencies do not change
rev.h
main.o
swap.h
swap.o
rev.c
rev.o
all: main.o swap.o rev.o
gcc main.o swap.o rev.o –o prg
main.o: main.c rev.h
gcc –c main.c
prg
swap.o: swap.c swap.h
gcc –c swap.c
rev.o: rev.c rev.h swap.h
gcc –c rev.c
swap.c
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
19
C Programming Exercise
• The value of exp1 and exp2?
float a = 1e20;
float b = -1e20;
float c = 3.14;
exp1 = (a + b) + c;
exp2 = a + (b + c);
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
20
C Programming Exercise
• The value of exp1 and exp2?
float a = 1e20;
float b = -1e20;
float c = 3.14;
exp1 = (1e20 – 1e20) + 3.14 = 3.14
exp2 = a + (b + c);
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
21
C Programming Exercise
• The value of exp1 and exp2?
float a = 1e20;
float b = -1e20;
float c = 3.14;
exp1 = (1e20 – 1e20) + 3.14 = 3.14
exp2 = 1e20 + (-1e20 + 3.14) = 1e20–1e20 = 0
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
22
C Programming Exercise
• What is the value of exp in following expression:
unsigned int a = 1; // assume unsigned int is 4-byte long
unsigned long exp;
// assume unsigned long is 8-byte long
exp = (a << 32);
exp = (unsigned long)(a << 32);
exp = (unsigned long)a << 32;
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
23
C Programming Exercise
• What we will see on the screen if the following lines of code are executed
int x = -1;
unsigned int y = 0;
if (x < y) {
printf(“Hello\n”);
} else {
printf(“world”);
}
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
24
C Programming Exercise
• Assume A is an array of integer, we have pointer int* p = A, determine
the equivalent expression in terms of A referencing (e.g. *(p + 1) = A[1])
*(p + 7)
p[10]
*(&p[2] + 4)
*(&(*p) + 2)
*(p – 1)
Autumn 2016
FACULTY OF COMPUTER SCIENCE AND ENGINEERING
HO CHI MINH CITY UNIVERSITY OF TECHNOLOGY
25