Top Banner
Link 6. Loading Young W. Lim 2018-12-21 Fri Young W. Lim Link 6. Loading 2018-12-21 Fri 1 / 30
30

Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

May 24, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Link 6. Loading

Young W. Lim

2018-12-21 Fri

Young W. Lim Link 6. Loading 2018-12-21 Fri 1 / 30

Page 2: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Outline

1 Linking - 6. LoadingBased onLoadingthe startup codelink script and startup code

Young W. Lim Link 6. Loading 2018-12-21 Fri 2 / 30

Page 3: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Based on

"Self-service Linux: Mastering the Art of Problem Determination",Mark Wilding"Computer Architecture: A Programmer’s Perspective",Bryant & O’Hallaron

I, the copyright holder of this work, hereby publish it under the following licenses: GNU head Permission is granted tocopy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts,and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

CC BY SA This file is licensed under the Creative Commons Attribution ShareAlike 3.0 Unported License. In short:you are free to share and make derivative works of the file under the conditions that you appropriately attribute it,and that you distribute it only under a license compatible with this one.

Young W. Lim Link 6. Loading 2018-12-21 Fri 3 / 30

Page 4: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

the memory image

1 invoking the loader2 loading3 run-time memory image4 creating the memory image

Young W. Lim Link 6. Loading 2018-12-21 Fri 4 / 30

Page 5: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

invoking the loader

the shell runs an executable object fileby invoking some memory resident os codeknown as the loader

any program can invoke the loaderby calling the execve function

Young W. Lim Link 6. Loading 2018-12-21 Fri 5 / 30

Page 6: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

loading

the process of copying the program into memoryand then running it, is known as loading

the loader copies the code and the datain the executable object file from disk into memory

then runs the program by jumpingto its first instruction (entry point)

Young W. Lim Link 6. Loading 2018-12-21 Fri 6 / 30

Page 7: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

run-time memory image (1)

the code segment always startsat address 0x08048000the data segment followsat the next 4-KB aligned addressthe runtime heap followson the first 4-KB aligned addresspast the read/write segmentgrows up via calls to the malloc libraryshared libraries startsat address 0x40000000

Young W. Lim Link 6. Loading 2018-12-21 Fri 7 / 30

Page 8: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

run-time memory image (2)

the user stack always startsat address 0xbfffffffand grows down (towards lower memory addresses)the segment starting above the stackat address 0xc0000000is reserved for the code and datain the memory resident part ofthe operating system (kernel)

Young W. Lim Link 6. Loading 2018-12-21 Fri 8 / 30

Page 9: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Linux Run-time Memory Image (1)

Kernel . . . . . . . . . . . . . . . . 0xc0000000User Stack . . . . . . . . . . . . %esp

Shared Libraries . . . . . . . 0x40000000Run-time Heap . . . . . . .. brkRead/Write segmentRead-only segment . . . . 0x08048000Unused . . . . . . . . . . . . . . . 0x00000000

Young W. Lim Link 6. Loading 2018-12-21 Fri 9 / 30

Page 10: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Linux Run-time Memory Image (2)

Kernel . . . . . . . . . . . . . . . . 0xc0000000memory invisible to user code

User Stack . . . . . . . . . . . . %espcreated in run timegrows toward decreasing addresses

Shared Libraries . . . . . . . 0x40000000grow toward increasing addresses

Run-time Heap . . . . . . .. brkcreated by malloc

Young W. Lim Link 6. Loading 2018-12-21 Fri 10 / 30

Page 11: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Linux Run-time Memory Image (3)

Read/Write segment.data and .bss

-loaded from the executable fileRead-only segment . . . . 0x08048000

.init, .text, .rodata

-loaded from the executable fileUnused . . . . . . . . . . . . . . . 0x00000000

Young W. Lim Link 6. Loading 2018-12-21 Fri 11 / 30

Page 12: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Linux Run-time Memory Image

Kernel Virtual Memory Memory invisible to user code 0xc0000000User Stack created at run time %esp

Shared Libraries 0x40000000

Run-time Heap created by malloc brkRead/Write segment .data, .bssRead-only segment .init, .text, .rodata 0x08048000Unused 0x00000000

Young W. Lim Link 6. Loading 2018-12-21 Fri 12 / 30

Page 13: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

the startup code

1 creating the memory image2 jumping to the entry point3 the crt1.o startup routine4 Startup code5 forking child process6 invoking the loader7 deferring copying

Young W. Lim Link 6. Loading 2018-12-21 Fri 13 / 30

Page 14: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

creating the memory image

when the loader runs, it creates the memory imageguided by the segment header table in the executableit copies chunks of the executableinto the code and data segments

Young W. Lim Link 6. Loading 2018-12-21 Fri 14 / 30

Page 15: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

jumping to the entry point

after copying the executable, the loaderjumps to the program’s entry pointthe address of the _start symbolthe start-up code at the _start addressis defined in the object file crt1.o andis the same for all C programs

Young W. Lim Link 6. Loading 2018-12-21 Fri 15 / 30

Page 16: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

the crt1.o startup routine

0x080480c0 <_start> // entry point in .textcall __libc_init_first // startup code in .textcall _init // startup code in .initcall atexit // startup code in .textcall main // application main routinecall _exit // returns control to OS

Young W. Lim Link 6. Loading 2018-12-21 Fri 16 / 30

Page 17: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Startup code (1)

after calling initialization routinesfrom the .text and .init sectionsthe startup code calls the atexit routinethe atexit routine registersa list of routines to be calledwhen the application (main)calls the exit functionthe exit function runsthose functions registered by atexitthen returns control to the osby callying _exit

Young W. Lim Link 6. Loading 2018-12-21 Fri 17 / 30

Page 18: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

Startup code (2)

when the startup code callsthe application’s main routine,the C code begins to execute

after the application returns(exit is called),the startup code callsthe _exit routine,which returns control to the os

Young W. Lim Link 6. Loading 2018-12-21 Fri 18 / 30

Page 19: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

forking child process

each program runs in the context of a processwith its own virtual address spacethe parent shell process forks a child processthat is a duplicate of the parentthe child process invokes the loadervia execve system callthe loader deletes the child’sinitial virtual memory segmentsthat are copied from the parent processand creates a new set ofcode, data, heap, and stack segments

Young W. Lim Link 6. Loading 2018-12-21 Fri 19 / 30

Page 20: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

invoking the loader

the new stack and heap segments areinitialized to zerothe new code and data segments areinitilialized to the contents of the executable fileby mapping pages in the virtual address spaceto page-sized chunks of the executable filefinally the loader jumps to the _start addresswhich eventually calls the application’s main routine

Young W. Lim Link 6. Loading 2018-12-21 Fri 20 / 30

Page 21: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

deferring copying

during the loading process,there is no copying of data from disk to memoryexcept some header information

the copying is deferred until the CPU referencesa mapped virtual page, at which point the osautomatically transfers the page from disk to memoryduring it’s paging mechanism

Young W. Lim Link 6. Loading 2018-12-21 Fri 21 / 30

Page 22: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

execve

#include <unistd.h>

int execve( const char *filename,~char *const argv[],~char *const envp[] );

Young W. Lim Link 6. Loading 2018-12-21 Fri 22 / 30

Page 23: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

execve example

#include <unistd.h>#include <stdio.h>

int main(void){

char *argv[] = { "/bin/sh", "-c", "env", 0 };char *envp[] ={ "HOME=/",

"PATH=/bin:/usr/bin","TZ=UTC0","USER=beelzebub","LOGNAME=tarzan",0 };

execve(argv[0], &argv[0], envp);fprintf(stderr, "Oops!\n");return -1;

}

https://stackoverflow.com/questions/7656549/understanding-requirements-for-execve-and-setting-environment-vars

Young W. Lim Link 6. Loading 2018-12-21 Fri 23 / 30

Page 24: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

.data section

the .data section contains variablesVariables change at run timethe variables need to be in RAMFlash, unlike RAM, is not easily changed at run time.the flash contains the initial values ofthe variables in the .data section.the startup code copies the .data sectionfrom flash to RAM to initialize the run-time variables in RAM.

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 24 / 30

Page 25: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

linker script

the object code created by your compiler has not beenlocated into the microcontroller’s memory map.the linker will do this task andthat is why you need a linker scriptthe linker script is input to the linkerand provides some commandson the location and extent of the system’s memory.

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 25 / 30

Page 26: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

startup code

a C program that begins at main does not run in a vacuumbut makes some assumptions about the environmentassumes that some variables are already initializedthe startup code is necessary to put in place all the thingsthat are assumed to be in place when main executes(the "run-time environment").The stack pointerthe constructors of static objects in C++

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 26 / 30

Page 27: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

load address and run-time address (1)

When you load a program on an operating systemyour .data section basically non-zero globals are loadedfrom the "binary" into the right offset in memory,so that when your program starts those memory locationsthat represent your variables have those values.

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 27 / 30

Page 28: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

load address and run-time address (2)

unsigned int x=5;unsigned int y;

in the above code, you expect x to be 5 when you first startif are booting from flash, bare metal,you dont have an operating system to copy that value into ram,it has to be copied manualy.all of the .data stuff has to be in flash,that number 5 has to be somewhere in flashso that it can be copied to RAM.So you need a flash address for itand a ram address for it.

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 28 / 30

Page 29: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

startup code

any function can call any other functiona local variable x to be 5 and y will be assumed to be zerothe startup code at a minimum for generic C sets up

the stack pointerlocal variables.bss to zeroinitialize variables

if you dont have an operating systemthen you have to code the abovecannot use system calls (printf, fopen, . . . )but depending on toolchain,you don’t have to write the linker script nor the bootstrap

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 29 / 30

Page 30: Link 6. Loading - upload.wikimedia.org · invoking the loader theshellruns anexecutableobjectfile byinvoking somememoryresidentoscode knownastheloader anyprogramcaninvoke theloader

linker scripts

the linker script defines the memory layout ofyour target and application.in the bare-metal programming, there is no OSto handle that for you.the start-up code is required to at least setan initial stack-pointer, initialise static data,and jump to main.On an embedded system it is also necessary toinitialise various hardware such as the PLL, memory controllers etc.

https://stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

Young W. Lim Link 6. Loading 2018-12-21 Fri 30 / 30