Получение размера программы

Тема в разделе "LANGS.C", создана пользователем Pushkoff, 30 сен 2007.

  1. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    как получить размер программы на стадии компиляции
    компилятор M$VC

    Код (Text):
    1. #define MULTIBOOT_HEADER_MAGIC      0x1BADB002
    2. #define MULTIBOOT_HEADER_FLAGS          0x00010003
    3. #define MULTIBOOT_BOOTLOADER_MAGIC      0x2BADB002
    4. #define START_ADDRES                    0x100000
    5. #define STACK_OFFSET                    0x10000
    6. #define IMAGE_SIZE                  0x600
    7.  
    8. #if defined(_M_IX86)
    9.  
    10. void main();
    11.  
    12. void __declspec(naked) start()
    13. {
    14.     __asm
    15.     {
    16.         mov esp,100000h+STACK_OFFSET
    17.         push    0
    18.         popfd
    19.         call    main
    20.         cli
    21.         hlt
    22.     };
    23. }
    24.  
    25. const unsigned mbheader[]=
    26. {
    27.     MULTIBOOT_HEADER_MAGIC,
    28.     MULTIBOOT_HEADER_FLAGS,
    29.     -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS),
    30.     (unsigned)mbheader,
    31.     START_ADDRES,
    32.     START_ADDRES+IMAGE_SIZE,
    33.     START_ADDRES+STACK_OFFSET,
    34.     (unsigned)start
    35. };
    36. #else
    37. #error Not defined multiboot entry for this arhitecture
    38. #endif
    39.  
    40.  
    41. void main()
    42. {
    43.  
    44. }
    Мне нужно чтоб на стадии компиляции вместо макроса IMAGE_SIZE подставлялся размер программы автоматически...
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не получится, имхо.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    интересно как ты себе это представляешь?
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    определеть параметр ещё несуществующей программы? хм...
     
  5. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    вот пример из какого-то ассемблера идущего вместе с GCC

    Код (Text):
    1. multiboot_header:
    2.     .long   MULTIBOOT_HEADER_MAGIC
    3.     .long   MULTIBOOT_HEADER_FLAGS
    4.     .long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    5.     .long   multiboot_header
    6.     .long   _start
    7.     .long   _edata
    8.     .long   _end
    9.     .long   multiboot_entry
    _edata это конец секции данных, после неё идет секция BSS которая заканчивается на _end
    как мне такое повторить в M$VC?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    с макросами никак, препроцессинг идет до компиляции, на стадии препроцессирования размер программы не может быть известен.
    без макросов - хз, вроде тоже никак

    в асе не так - длина команды фиксирована и может быть определен размер программы сразу после прохода по листингу. но тоже, естественно, не на стадии препроцессирования
     
  7. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    а как узнать начало секции BSS?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Pushkoff
    возьми какуюнить переменную глобальную неинициализированную из начала и ее адрес округли вниз до границы секций. Я думаю, что точно попадешь
     
  9. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    Great
    А если в проекте много модулей, как узнать какой из них будет первым?

    По моим наблюдениям, секция .bss является продолжением секции .data, в данный момент у меня нет переменных которые должны попадать в секцию .data, но есть переменная которая должна попасть в секцию .bss, следовательно raw_data_size секции .data должно быть равно 0 (так как все данные неинициализированы), а оно равно 0х200. При больших размерах секции данных секция .bss не отображается в файле...

    компилятор из M$VC 9.0 Express
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Pushkoff
    Вообще попробуй тупо напрямую прочитать таблицу секций и всё.
     
  11. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    Great
    по коду который я привел происходит запуск программы при помощи загрузчика GRUB, поэтому значение размера должно быть вкомпилировано в программу...
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Откомпилировать с фиктивным значением, после компиляции посмотреть размер и хекс-редактором изменить фиктивное значение на актуальное ;))
     
  13. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    FatMoon
    Я сейчас так и делаю, только компилирую второй раз со значением размера программы, полученным при первой компиляции... Но это не очень удобно...