Есть сгенерированный исходник на плюсах, содержащий два статически инициализированных массива структур и код между ними, примерно такого вида:
struct global_sym {
char* name;
void* target;
};
struct global_sym imported_syms[]={
{ 0, 0 }
};
//тут код, где объявляются нижеупомянутые ops_fed и reset_ops
struct global_sym exported_syms[]={
{ "ops_fed" , &ops_fed },
{ "reset_ops" , (void*) reset_ops },
{ 0, 0 }
};
В программе вызывается gcc для компиляции этого исходника:
command = "gcc" + filename + " -c -g -fPIC -o " + obj_name + " 2>&1";
output = popen(command.c_str(),"r");
В скомпилированном таким способом коде
отсутствует второй массив структур, nm такого символа не видит! Но первый массив присутствует:
0000000000000000 B imported_syms.
Во время выполнения программа выводит команду, которой выполняется компиляция. Так вот, если выполнить эту команду в шелле, то, как и должно быть, в объектнике появятся оба массива:
0000000000000000 D exported_syms
0000000000000000 B imported_syms
Собственно вопрос: почему gcc (3.4.6) считает себя в праве удалить массив и почему он этого не делает при вызове ручками (код, опции и компилятор тот же)?