Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2024, 17:37   #1
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 32
По умолчанию Как происходит компиляция программы в Visual Studio и как ей управлять?

Объясните, пожалуйста, как происходит компиляция программ, написанных на C++ в Visual Studio. Происходит запуск компилятора CL.EXE, затем компоновщика LINK.EXE, в результате на выходе получается исполняемый файл формата PE. Если посмотреть структуру формата PE, то она такая:

Код:
MZ-заголовки
PE-заголовки
описания секций
секция .idata
секция .rdata
секция .data
секция .text
таблица импорта
Но структура программы на C++ после раскрытия директив #include

Код:
<протопипы функций>
<инициация структур>
<инициация классов>
<инициация типов>

void main()
{
   <операторы объявления переменных>
   <прочие операторы>
}

<функция f1>()
{
   <операторы объявления переменных>
   <прочие операторы>
}

<функция f1>()
{
   <операторы объявления переменных>
   <прочие операторы>
}
Я правильно понимаю, что при компиляции машинный код не просто создаётся, но ещё и раскидывается по разным секциям: код, создаваемый операторами объявления переменных попадёт в .data, например? А тот код, который присутствует перед функцией main() вообще непосредственного машинного кода не создаст.
Iskatel S вне форума Ответить с цитированием
Старый 26.02.2024, 20:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
Я правильно понимаю, что при компиляции машинный код не просто создаётся, но ещё и раскидывается по разным секциям
Код не раскидывается, за исключением микроконтроллеров и ручного разбиения.

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
код, создаваемый операторами объявления переменных попадёт в .data, например?
Нет. В .data даннные, естественно, если в ручную не перенастраивали.

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
А тот код, который присутствует перед функцией main() вообще непосредственного машинного кода не создаст.
А куда ж он девается? Глобальные переменные, кто инициализуует? Другие функции, кроме main куда деваются?
p51x вне форума Ответить с цитированием
Старый 26.02.2024, 23:01   #3
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 32
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код не раскидывается, за исключением микроконтроллеров и ручного разбиения.
Тогда как создаются секции .rdata, .data и .text? В C++ в отличие от ассемблера же нет обязательного задавания секций.
Iskatel S вне форума Ответить с цитированием
Старый 27.02.2024, 08:17   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
В C++ в отличие от ассемблера же нет обязательного задавания секций.
И? Как это мешает компилятору следовать спецификации pe формата?
p51x вне форума Ответить с цитированием
Старый 27.02.2024, 10:04   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
Я правильно понимаю, что при компиляции машинный код не просто создаётся, но ещё и раскидывается по разным секциям: код, создаваемый операторами объявления переменных попадёт в .data, например?
Если вопрос задается именно таким образом, ответ будет да. ЯВУ на то и ЯВУ, код на нем не является линейным.
Vapaamies вне форума Ответить с цитированием
Старый 27.02.2024, 11:08   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
ответ будет да
И какой код кладется в .data, .rdata?
p51x вне форума Ответить с цитированием
Старый 28.02.2024, 07:12   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И какой код кладется в .data, .rdata?
В .data обычно попадают инициализированные глобальные переменные, в .rdata — строки, RTTI, импорты. Зависит от конкретного компоновщика, версии, параметров командной строки...

Вот, взял наугад первую попавшуюся программу — какую-то старую версию PuTTY:
Код:
        /\_/\
    .__/ o o \    PE Tool 0.7 build 18
   /~__;==t==/    Copyright © 2013-2018, 2020 Vladislav Javadov
  (_____)_m_m)

     Loading  putty.exe        512908 bytes  100.0%
  Image data                   513024 bytes  100.0%
 Fixing stub                        0 bytes    0.0%
   Estimated  putty.exe        513024 bytes  100.0%
       Total                      116 bytes    0.0%

Image/machine/subsystem type  PE/x86/GUI
        OS/subsystem version  4.0/4.0
                  Image base  00400000
        Stack commit/reserve  1000/100000
         Heap commit/reserve  1000/100000
Section alignment (file/RVA)  200/1000

Headers and sections (file/RVA)
     {stub}  00000/00000         64 bytes    0.0%
  {headers}  00040/00040        408 bytes    0.1%
      .text  00200/01000     374272 bytes   73.0%  ·C·········XR·
     .rdata  5B800/5D000     117760 bytes   23.0%  ··D·········R·
      .data  78400/7A000       5120 bytes    1.0%  ··D·········RW
      .rsrc  79800/80000      15360 bytes    3.0%  ··D·········R·
Флаги в последнем столбце показывают тип данных и права доступа к ним. У секции .data доступ RW, что подразумевает инициализированные переменные, как я и говорил, а у .rdata — R, при визуальном просмотре видны сперва двоичные данные (тоже какие-то переменные?), потом строки и импорты.

Разнесение переменных и констант по разным секциям повышает безопасность — страницы памяти, относящиеся к .rdata, защищены от записи на уровне процессора и ОС, попытка записи туда вызовет AV.

Странно, что у секции ресурсов нет флага “discardable”. Смысл тогда отдельную секцию городить? Но это так, мои размышления вслух...
Vapaamies вне форума Ответить с цитированием
Старый 28.02.2024, 08:30   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
В .data обычно попадают инициализированные глобальные переменные, в .rdata — строки, RTTI, импорты.
Т.е. у меня в блокноте не стих, а коды?
p51x вне форума Ответить с цитированием
Старый 28.02.2024, 11:53   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
у меня в блокноте
Поднимите выше, мне отсюда не видно.
Vapaamies вне форума Ответить с цитированием
Старый 07.03.2024, 10:00   #10
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 32
По умолчанию

А какие ещё программы кроме PE Tool есть, желательно GUI?
Iskatel S вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
компиляция программы в Visual Studio на mac Vano90 Помощь студентам 7 20.06.2016 12:14
Компиляция в Visual Studio 2012 Hellgate Помощь студентам 2 01.10.2013 12:09
Компиляция релиза в Visual Studio для QT SDK 1.1.0 tumanovalex Qt и кроссплатформенное программирование С/С++ 0 29.05.2011 19:32
компиляция проекта в Visual Studio 2008 kess Visual C++ 1 16.03.2010 12:36
MS Visual Studio компиляция с ошибкой! terran4ic Помощь студентам 16 02.10.2009 15:19