Раньше ошибочные звонки теперь не работают? - PullRequest
0 голосов
/ 10 февраля 2019

Я не уверен, что я бред, но я близок к определенным вызовам, использовавшимся при сбое в System V Linux x86_64, если они не были выровнены при входе (то есть вы намеренно отклонилисьстек перед call, поэтому он выравнивается при входе).

Например (теперь это работает):

.data
str: .asciz "string literal"

.text
.globl main
main:
    lea str(%rip), %rdi
    call puts@plt
    xor %eax, %eax
    ret

Я почти уверен, что раньше это не получалось, может кто-нибудь объяснитьесли я: бредовый (то есть это всегда работало), неправильно понимающий семантику выравнивания стека, не подозревающий (несколько недавних?) изменений в чем-то, где-нибудь?* (согласно общему прологу) или просто sub $8, %rsp, но теперь код, который я пишу без этого, кажется, работает нормально?

Это нюанс или это поведение сейчас приемлемо?

1 Ответ

0 голосов
/ 11 февраля 2019

Вы не бредите.SysV ABI x86-64 требует, чтобы стек был выровнен до 16 перед вызовом внешней функции, подразумевая, что значение указателя стека mod 16 равно 8 при входе в функцию, и что оно должно быть отрегулировано нечетным кратным 8 для выравниванияэто до вызова другой функции.Однако это не строго соблюдается.Сам вызов никогда не будет ошибочным, равно как и большинство типов инструкций, используемых для доступа к стеку.Он вызывает ошибку только в том случае, если вызываемая функция получает доступ к значению в стеке, используя инструкцию, которая требует выравнивания, например определенные инструкции SSE (включая расширения SSE и AVX).

Реализации некоторых библиотечных функций всегда выполняют такиедоступ, поэтому они всегда будут неисправны в невыровненном стеке.Некоторые другие библиотечные функции могут выполнять такой доступ к стеку в зависимости от данных, которые они передают, а некоторые никогда не используют такие доступы и не будут работать независимо от выравнивания стека.Однако не стоит полагаться на это, поскольку реализации могут измениться.Всегда выравнивайте свой стек перед тем, как сделать звонок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...