MSVC: встраивание данных в программу - PullRequest
0 голосов
/ 04 марта 2010

Я надеюсь, что кто-то сталкивался с подобной проблемой раньше и может дать мне подсказку, чтобы решить ее.

В Microsoft Visual C ++ 2005 у меня есть такой код в программе:

DWORD locator[FOURXFLAGCOUNT+1]={
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x00000000
};

Идея состоит в том, чтобы сделать locator обнаруживаемым (и заполняемым) из вне программы - т.е. ее заполняет другая программа, так что эта программа будет встроена при запуске , Это для защиты от кражи, поэтому нет обычного способа получить данные, это нужно сделать примерно так.

Это прекрасно работало, когда я сам компилировал программу, но когда я добавил в нее статическую библиотеку, данные исчезли. Символ locator все еще там; данные, с которыми он должен быть инициализирован (и которые должны быть видны снаружи), не являются.

Переключатель компоновщика / OPT: NOREF решает проблему, но по недопустимой цене: программа увеличивается на несколько сотен К (кажется, не так много, но в данном случае это так). Использование #pragma comment(linker, "/include:?locator@@BLAHBLAH") (не помню, какой была часть "BLAHBLAH") ничего не сделало - символ locator уже виден, он просто не инициализирован. Перемещение определения locator в библиотеку также не помогает.

Отказ от статической библиотеки - последнее средство, я бы не стал этого делать, если бы мог избежать этого.

Есть идеи?

Ответы [ 5 ]

1 голос
/ 04 марта 2010

Мне не удалось найти приемлемого решения этой проблемы. Линкер просто слишком агрессивен в отношении того, что он урезает ... может быть, ошибка, может быть, преднамеренная, хотя для моей жизни я не могу представить случай, когда вы бы захотели исключить инициализацию переменная при сохранении самой переменной.

На данный момент я включил параметр / OPT: NOREF. Мне просто придется иметь дело с дополнительным размером, по крайней мере, пока я не найду способ обойти это.

0 голосов
/ 05 марта 2010

Имеет ли значение, если вы объявляете массив extern?

0 голосов
/ 05 марта 2010

Проблема в том, что локатор оптимизирован, потому что ничто не ссылается на него? Поможет ли что-то подобное в вашей основной программе?

DWORD d=0;
int i=0;
for (i=0; i<FOURXFLAGCOUNT; i++) d += locator[i];

Или даже только это, но, возможно, не на всех компиляторах:

(void)locator[0];
0 голосов
/ 04 марта 2010

Добавьте функцию, которая использует locator, например, которая строит xor поверх нее.Вам не нужно вызывать эту функцию, но вы должны экспортировать ее, добавив в файл .DEF или используя __declspec( DllExport ).

0 голосов
/ 04 марта 2010

Вы можете попробовать изменить локатор DWORD на статический локатор DWORD. Не уверен, что это поможет, но только мысль. Кроме того, включите ссылку на локатор где-то еще в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...