Where are the symbols etext, edata and end defined?

c, gcc, ld, linker

Solution

These symbols are defined in a linker script file (dead link copy at archive.org).

Problem

This is a code from Linux man page: ``` #include <stdio.h> #include <stdlib.h> extern char etext, edata, end; int main() { printf("First address past:\n"); printf(" program text (etext) %10p\n", &etext); printf(" initialized data (edata) %10p\n", &edata); printf(" uninitialized data (end) %10p\n", &end); exit(EXIT_SUCCESS); } ``` when run, the program below produces output such as the following: ``` $ ./a.out First address past: program text (etext) 0x8048568 initialized data (edata) 0x804a01c uninitialized data (end) 0x804a024 ``` Where are `etext`, `edata` `end` defined ? How those symbols are assigned values ? Is it by linker or something else ?

Original source