Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// 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"};
MRE Developer FAQ
This document contains information that is proprietary to MediaTek Inc.
Загрузчик программ из MRE не умеет сложные фиксапы, поэтому изменяйте свой код, чтобы в нём не было адресов, которые нужно определять в момент загрузки.
Самое интересное, что официальный™ лаунчер из MRE SDK по умолчанию вызывает и gcc (Mentor Codesourcery G++), и armcc (ARM Developer Suite или Realview Compilation Tools) с ключом -fPIC.
Отсосу бамп.
Пускай Зеленый скрасит житие твое
И пусть зажгут все лампы и официанты
Швыряют бриллианты в большой унитааааз