Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Visual Studio: новая секция, нарушение прав доступа при выделении памяти (0xC0000005)
Посл.ответ Сообщение


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 12 июля 2014 22:46 · Поправил: Crawler
· Личное сообщение · #1

Есть программа, в которой выделяется новая секция кода:

Code:
  1. #pragma section(NEW_SECTION_NAME, read, write, execute)
  2. #pragma code_seg()
  3.  
  4. void Func (void)
  5. {
  6. char *= new char [25];
  7. _tmain(NULL,NULL);
  8. }



(в main.cpp, соответственно, пишется #pragma comment(linker, "/entry:Func") - чтобы сначала вызывалась функция из новой секции).
Ошибка происходит при выделении памяти (Необработанное исключение по адресу 0xBB40E64E в application.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0xBB40E64E).

Причем и в дебаг, и в релиз-версиях.

Это наверняка связано с тем, что я неправильно создал секцию (что-то не учел).

Буду благодарен за помощь!

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 июля 2014 22:57
· Личное сообщение · #2

а что это вообще? длл или что?
в обычных программах для вызова чего то до вызова main статические обьекты запускаются
их и создавайте если что то хотите вызвать раньше
да и tmain там к какому месту?

malloc попробуй
думаю секция там не причем
хотя код надо смотреть что там студия нагенерила

| Сообщение посчитали полезным: Crawler

Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 12 июля 2014 23:04
· Личное сообщение · #3

Ну видимо так как crtMain вы изменили то C++ runtime не инициализирован, следовательно оператор new сбоит

| Сообщение посчитали полезным: Crawler

Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 12 июля 2014 23:05 · Поправил: deniskore
· Личное сообщение · #4

Проверил, все работает, никаких исключений.
Code:
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #pragma comment(linker, "/entry:func")
  4.  
  5. int main()
  6. {
  7.          printf("main()\n");
  8. }
  9.  
  10. #pragma code_seg("test")
  11. void func(void)
  12. {
  13.          char *= new char[25];
  14.          memset(a, 0x90, 1);
  15.          main();
  16. }


| Сообщение посчитали полезным: Crawler

Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 12 июля 2014 23:10
· Личное сообщение · #5

И вообще, выделяйте секцию лучше так:
Code:
  1. #pragma comment(linker, "/SECTION:.test,ERW")
  2. #pragma code_seg(".test")





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 13 июля 2014 01:32 · Поправил: Crawler
· Личное сообщение · #6

Вы абсолютно правы, действительно, переставил местами функции (запилил основной код в новой секции, а в main () поместил содержимое моей секции, вызываемой первой.

Не учел, что во время инициализации, в том числе, (цитата):

Происходит инициализация динамической памяти (кучи).

Я думал, что если линкеру явно задать функцию параметром /entry, то он будет ее использовать вместо main (вроде обычного переименования). Ошибся, инициализация действительно происходит с вызовом main.

Всем большое спасибо!

Да, и это я экспериментировал с антиэмуляцией и антиотладкой - в отдельной секции для удобства пилю кое-какие потоки с таймерами, разными проверками и так далее

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.



 eXeL@B —› Программирование —› Visual Studio: новая секция, нарушение прав доступа при выделении памяти (0xC0000005)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати