Segfault, имитирующий #Embed на GCC 14 с .incbin в .rodata и определение глобального промежутка <>C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Segfault, имитирующий #Embed на GCC 14 с .incbin в .rodata и определение глобального промежутка <>

Сообщение Anonymous »

У меня есть проект, который должен использовать GCC 14, который не имеет поддержки #embed. < /p>
Я попытался моделировать его следующим образом. < /p>
namespace {
namespace {
extern "C" {
extern std::byte const t1StartPtr[];
extern std::byte const t1EndPtr[];
}
asm(R"(
.section .rodata
.global t1StartPtr
.global t1EndPtr
.balign 8
t1StartPtr:
.incbin "/tmp/t1File.zip"
t1EndPtr:
)");
std::span t1 { t1StartPtr, t1EndPtr };
}

// Adding this reference makes the crash go away
//std::span const & t1ConstRef = t1;

namespace {
extern "C" {
extern std::byte const t2StartPtr[];
extern std::byte const t2EndPtr[];
}
asm(R"(
.section .rodata
.global t1StartPtr
.global t1EndPtr
.balign 8
t2StartPtr:
.incbin "/tmp/t2File.zip"
t2EndPtr:
)");
std::span t2 { t2StartPtr, t2EndPtr };
}

// Adding this reference makes the crash go away
//std::span const & t2ConstRef = t2;
}
< /code>
Все отлично подходят для первого файла, который я включаю. (очень вероятно), что я наткнулся на какое -то неопределенное поведение - особенно потому, что я смешиваю в встроенной сборке, но я не уверен, что именно неправильно. /> По словам, что std :: span правильно выровнен (они оба выровнены по границам 16 байтов) < /li>
Проверка (в отладчике), что _m_ptr в 2 -й промежутке записан. Исправьте проблему) Может ли кто -нибудь определить то, что я делаю неправильно (конечно, я довольно слаб в своей встроенной сборке). < /P>
Редактировать - для ясности фактические файлы .zip, которые я использую для данных (не для исполняемого кода), так что до тех пор, пока страница (ы), содержащие эти файлы, отображаются как чтение, это должно быть в порядке. MSVC был бы огромным подъемом по другим причинам в проекте. Содержимое которого я не могу загрузить. Я посмотрю, смогу ли я выяснить что -то похожее на загрузку для компилятора Explorer. Общий исполняемый размер весит примерно на 275 МБ < /p>
Еще одна потенциально релевантная точка-код выборки, который я показываю, находится в статически связанной библиотеке (хотя проверка памяти, на которую ссылаются указатели начала и окончания, показывает, что память читается и содержит правильные данные) < /p>
edte-tag 64-бит на x86-64 < /p> < /p>
ed. /> Приношу извинения при тестировании .pushsection /.popsection я должен был что -то испортить. даст им ответ.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ining-a-gl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»