• XSS.stack #1 – первый литературный журнал от юзеров форума

Clang строки на стеке

fadey_ldr

RAID-массив
Пользователь
Регистрация
15.05.2023
Сообщения
51
Реакции
17
Есть необходимость выделить строки на стеке, что бы они не попадали в .rdata
В msvc компиле ранее делал так
char mas[] = {'s', 't', 'r', 'i', 'n', 'g', 0};
по итогу на стеке выделялось место под строку, и сама строка заполнялась кодом, посимвольно или блоками, но результат был тот, что мне нужен.

недавно попытался сделать то же самое в clang, и понял что этот трюк не прокатывает, массивы символов объединяются в строки и сохраняются в .data/.rdata
clang использую прямо в студии, не отдельно через консольку
может есть какие-то настройки, которые надо покрутить ?
с msvc компиле такой финт срабатывает на максимальных оптимизациях, и строка располагается на стеке, а с clang нет. отключать оптимизацию не вариант.

городить конструкции типа таких тоже не вариант:
char mas[7];
mas[0] = 's';
mas[1] = 't';
...........
mas[6] = 0;
 
Как вариант определения в строк ф-цию и ей аттрибут
C++:
__attribute__ ((optnone))
( не проверял )
Проверял, не работает, надо что бы сами функции оптимизировались, но строки обьявленные в них - нет. Если выключать оптимизацию всех функций, где встречаются строки, то больше половины кода будет не оптимизировано, а это плохо
 
строки на стеке, что бы они не попадали в .rdata
Объявляете
char mas[] = {'s', 't', 'r', 'i', 'n', 'g', 0};
как локальную переменную, и не попадет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Проверял, не работает, надо что бы сами функции оптимизировались, но строки обьявленные в них - нет. Если выключать оптимизацию всех функций, где встречаются строки, то больше половины кода будет не оптимизировано, а это плохо
Можешь попробовать объявлять массивы, как volatile, но тогда компилятор будет генерировать довольно всратый код для обращения к массиву. Еще можно подумать о каком-то inline шаблоне, который будет делать asm-вставку для каждого символа (если ты на Плюсах пишешь, а не на Цэ).
 
Можешь попробовать объявлять массивы, как volatile, но тогда компилятор будет генерировать довольно всратый код для обращения к массиву.
Это тоже пробовал, даже с volatile кидает строки в дата секцию
Еще можно подумать о каком-то inline шаблоне, который будет делать asm-вставку для каждого символа (если ты на Плюсах пишешь, а не на Цэ)
На Цэ
 
как локальную переменную, и не попадет.
Да да именно так и обьявляю, внутри функции, локальная переменная, и все равно она вылезает в секцию данных, хотя она не static, обычная локальная переменная, причем не такая уж и длинная строка, что бы компилятор решил в целях оптимизации выкинуть ее в дату
 
Можешь попробовать объявлять массивы, как volatile, но тогда компилятор будет генерировать довольно всратый код для обращения к массиву. Еще можно подумать о каком-то inline шаблоне, который будет делать asm-вставку для каждого символа (если ты на Плюсах пишешь, а не на Цэ).
проверил volatile, работает
 
проверил volatile, работает
какая версия clang ? я вчера на 15 проверял, не помогало, может накрутил конечно чего-то в настройках, и еще важный момент, clang я использую из-под Visual Studio, не напрямую в консоли компилирую, возможно студия какие-то свои флаги добавляет ?

UPD. Проверил в консоли, да, volatile работает, и даже без него работает такая запись char mas[] = {'1', '2', '3', 0};
Подозреваю что студия голову морочит.
 
Последнее редактирование:
Подозреваю что студия голову морочит
Стопудово, я в linux скомпилировал и clang и gcc, локальные переменные в .data не попадают, а вот глобальные все в .data, хоть volatile их объявляй, хоть нет.
 
Последнее редактирование:
Стопудово, я в linux скомпилировал и clang и gcc, локальные переменные в .data не попадают, а вот глобальные все в .data, хоть volatile их объявляй, хоть нет.
Ну по идее все так и должно быть, локальные на стеке, глобальные в глобальной области видимости, то есть в секции данных
Но я видимо что-то навертел в настройках проекта, или сама студия шалит, надо попробовать новый проект сделать и проверить на нем, в старом уже опции компиляции менялись от дефолтных сотню раз
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх