- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
// 3.7 Position-independent Limitation
// At runtime an MRE program needs to be dynamically loaded into RAM. In other words, the addresses of the variables and functions can be dynamically assigned when they are loaded. This requires that the code be position-independent. If the code needs to determine the addresses at compile time, then it will fail to compile.
// The following code exemplifies this error.
/* 1 */
int a[10], b[10];
struct c {
int* d;
int* e;
};
struct c f = {a, b};
/* 2 */
void func1(void) {}
typedef struct struct1 {
int a;
void (*fun)(void);
} struct1;
struct1 array1[1] = {0, func1};
/* 3 */
char *str = "test";
char * list[] = {"zero", "one", "two"};
// The solution is as follows:
/* 1 */
int a[10], b[10];
struct c {
int* d;
int* e;
};
struct c f;
void init1(void) {
f.d = a;
f.e = b;
}
/* 2 */
void func1(void) {}
typedef struct struct1 {
int a;
void (*fun)(void);
} struct1;
struct1 array1[1];
void init2(void) {
array1[0].a = 0;
array1[0].fun = func1;
}
/* 3 */
char str[] = "test";
char list[][10] = {"zero", "one", "two"};