You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 09_Loading_Elf/02_Loading_And_Running.md
+36-1Lines changed: 36 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -47,7 +47,7 @@ Then from the other fields that need validation (that area not in the `e_ident`
47
47
48
48
Be aware that most of the variables and their values have a specific naming convention, for more information refer to the ELF specs.
49
49
50
-
Beware that some compilers when generating a simple executable are not using the `ET_EXEC` value, but it could be of the type `ET_REL` (value 1), to obtain an executable we need to link it using a linker. For example if we generated the executable: `example.elf` with `ET_REL` type, we can use `ld` (or another equivalent linker):
50
+
Another thing to be aware is that some compilers when generating a simple executable are not using the `ET_EXEC` value, but it could be of the type `ET_REL` (value 1), to obtain an executable we need to link it using a linker. For example if we generated the executable: `example.elf` with `ET_REL` type, we can use `ld` (or another equivalent linker):
51
51
52
52
```sh
53
53
ld -o example.o example.elf
@@ -62,6 +62,41 @@ readelf -e example.elf
62
62
63
63
Will print out all the executable information, including the type.
64
64
65
+
### Example: Creating a simple program for our kernel
66
+
67
+
For this example, let's create a very basic assembly program, that is a simple infinite loop:
68
+
69
+
```
70
+
extern loop
71
+
[bits 64]
72
+
loop:
73
+
jmp loop
74
+
75
+
```
76
+
77
+
The code, as we can expect is pretty simple, and self-explanatory, it declares a `loop` function, and mark it as global using the `extern` keyword..
*`-f elf64` is the output format (in our case we use elf64, but this depend on the target architecture).
87
+
*`-g` enable debug symbols
88
+
*`-F dwarf` is the debug symbols format (for elf64 we use dwarf, but again it can depends on the target architecture).
89
+
90
+
91
+
The last step is to use a linker to link the file, in this example we are going to use `ld`:
92
+
93
+
```sh
94
+
ld -g example_file.o -o example_file.elf -e loop
95
+
```
96
+
97
+
Where `-g` is a parameter that instructs the linker to include the debugging symbols, and `-e loop` instructs the linker to look for the symbol called `loop` as entry point of the program.
98
+
99
+
Now the program is ready to be loaded by our kernel, either as a bootloader module or a file on a filesystem (or any other way that allow the kernel to reach this executable).
0 commit comments