msvs linker options

Тема в разделе "LANGS.C", создана пользователем ASMatic, 13 ноя 2011.

  1. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Интересует можно ли както заставить линкер студии разместить данные в кодосекции (тут панятна "/MERGE:") но так дыба не менял месторасположение, т.е.

    Код (Text):
    1. void proc1(void)
    2. {
    3.   return;
    4. }
    5.  
    6. BYTE    data[] = {0x40,0x41,0x42};
    7.  
    8. void proc2(void)
    9. {
    10.   return;
    11. }
    в итоге интересует
    да, еще бы выключить генерацию (выравнивание?) 0xcc после\между фунок, дабы однозначно размещение было
    возможно такое вообще на студии 2008?


    *и вопрос2*
    Код (Text):
    1. typedef VOID (*MY_PROC)(VOID);
    2. BYTE _code[] = {0xcc,0xc2};
    3.  
    4. void main(void)
    5. {
    6.   ((MY_PROC)code)();
    7. }
    только заставить линкер генерить относительный call а не
    Код (Text):
    1. mov  eax, offset _code
    2. call eax
    3. *or*
    4. call [_code]
    думал linktime code generation поможет ему разобраться что по чем, но генерит не то чего хотелось бы(
     
  2. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    запросто
    Код (Text):
    1. extern "C" void func1(){}
    2. #pragma data_seg(push, r1, ".text")
    3. extern "C" __declspec(selectany,allocate(".text")) some_t subj;
    4. #pragma data_seg(pop, r1)
    5. extern "C" void func2(){}
    и в файле order.txt надо прописать
    func1
    subj
    func2
    в настройках линкера /ORDER:@order.txt
    в памяти subj должен находится между функциями а ключ
    ORDER будет следить за порядком расположения и да чтоб убрать между функциями 0xcc заключи весь код в прагму вот так
    Код (Text):
    1. #pragma optimize("gs", on)
    2. extern "C" void func1(){}
    3. #pragma data_seg(push, r1, ".text")
    4. extern "C" __declspec(selectany,allocate(".text")) some_t subj;
    5. #pragma data_seg(pop, r1)
    6. extern "C" void func2(){}
    7. #pragma optimize("", on)
     
  3. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    и да наверняка пригодится поставить атрибуты на секцию RWE
    Код (Text):
    1. #pragma comment(linker, "/SECTION:.text,RWE")
    2. #pragma optimize("gs", on)
    3. extern "C" void func1(){}
    4. #pragma data_seg(push, r1, ".text")
    5. extern "C" __declspec(selectany,allocate(".text")) some_t subj;
    6. #pragma data_seg(pop, r1)
    7. extern "C" void func2(){}
    8. extern "C" void end_code(){}
    9. #pragma optimize("", on)
    10.  
    11. size_t shell_size = (DWORD)end_code - (DWORD)func1;
    что особенно удобно можно иметь глобальные переменные между функциями и не надо извращатся запихивать их в функции через _emit
     
  4. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    ордер мне матерился на мои данные - не могу добавить ванингом отвечал..
    попробую по вашему варианту, сенкс!