compiling c code
play

Compiling C Code Philipp Koehn 28 October 2019 Philipp Koehn - PowerPoint PPT Presentation

Compiling C Code Philipp Koehn 28 October 2019 Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019 C Code 1 Source Code #include <stdlib.h> #include <stdio.h> int main(void) { printf("Hello


  1. Compiling C Code Philipp Koehn 28 October 2019 Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  2. C Code 1 • Source Code #include <stdlib.h> #include <stdio.h> int main(void) { printf("Hello world!\n"); return EXIT_SUCCESS; } • Compile linux> gcc -Og hello-world.c • Execute linux> ./a.out Hello world! Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  3. Compilation Steps 2 preprocessor compiler assembler linker cpp cc1 as ld .c .i .s .o exe • C code first gets compiled into assembly code • Assembly code is then converted into machine code Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  4. Even Simpler Program 3 • A simple C program: return47.c #define FOURTYSEVEN 47 int main(void) { return FOURTYSEVEN; } Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  5. Preprocessor 4 preprocessor compiler assembler linker cpp cc1 as ld .c .i .s .o exe • Resolves constants (#define) • Adds additional source code (#include) • Handles other directives like #ifdef / #endif • Example linux> gcc -Og -E return47.c [...] int main(void) { return 47; } Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  6. Compiler 5 preprocessor compiler assembler linker cpp cc1 as ld .c .i .s .o exe • Compilation into assembly code • Example linux> gcc -Og -S return47.c linux> cat return47.s [...] main: movl $47, %eax ret Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  7. Assembler 6 preprocessor compiler assembler linker cpp cc1 as ld .c .i .s .o exe • Conversion into machine code • Example linux> gcc -Og -c return47.c linux> objdump -d return47.o [...] 0000000000000000 <main>: 0: b8 2f 00 00 00 mov $0x2f,%eax 5: c3 retq Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  8. Linker 7 preprocessor compiler assembler linker cpp cc1 as ld .c .i .s .o exe • Adds start-up code • May combine multiple object files startup call main • Example main main: … linux> gcc -Og return47.c linux> ./a.out linux> echo $? 47 Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  9. 8 loops Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  10. Simple Program with For Loop 9 int main(void) { int sum = 0; for(int i=0;i<100;i++) { sum += i; } return 0; } Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  11. Assembly Code 10 main: movl $0, %eax jmp .L2 .L3: addl $1, %eax .L2: cmpl $99, %eax jle .L3 movl $0, %eax ret • Wait! --- where is the sum computed? • Removed by optimizations in compiler (sum is never used) • Compiling with -O9 would also remove loop Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  12. Use Sum as Return Value 11 int main(void) { int sum = 0; for(int i=0;i<100;i++) { sum += i; } return sum; } Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  13. Assembly Code 12 main: .LFB0: movl $0, %edx movl $0, %eax jmp .L2 .L3: addl %edx, %eax addl $1, %edx .L2: cmpl $99, %edx jle .L3 rep ret • Now sum is computed in register %eax (return value) Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  14. 13 hello world Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  15. Source Code 14 #include <stdlib.h> #include <stdio.h> int main(void) { printf("Hello world!\n"); return EXIT_SUCCESS; } Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  16. Assembly Code 15 • Compiled into: .LC0: .string "Hello world!" .text .globl main .type main, @function main: subq $8, %rsp movl $.LC0, %edi call puts movl $0, %eax addq $8, %rsp ret • Calls the function "puts" Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

  17. Machine Code (Disassembled) 16 • Object code linux> objdump -t hello-world.o [...] 0000000000000000 g F .text 0000000000000018 main 0000000000000000 *UND* 0000000000000000 puts • Function "puts" is labeled as undefined (*UND*) • Linker resolves this Philipp Koehn Computer Systems Fundamentals: Compiling C Code 28 October 2019

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend