Просто другой выбор имени, незначительный AFAIK.
i686 - это стандартное имя для 32-битного кода, использующее новые инструкции PPro, такие как CMOV и FCOMI, и 586 CMPGXCHG и CPUID. Современные дистрибутивы GNU / Linux обычно конфигурируют g cc, чтобы использовать его в качестве цели по умолчанию для -m32
32-битного кода вместо действительно базовой версии i386. например, g cc -v покажет i686-linux-gnu
для 32-битной сборки G CC.
Обычно clang использует call next_insn
/ pop reg
для чтения EIP в регистр. (Интересный факт: на самом деле не не нарушает предсказание обратного адреса на процессорах, отличных от оригинального Pentium-Pro или Via Nano3000: http://blog.stuffedcow.net/2018/04/ras-microbenchmarks/#call0 - особый случай процессоров call rel32=0
как не являясь реальным вызовом и не помещая адрес возврата в стек предикторов.)
get_pc_thunk.bx
включает в себя имя регистра для возврата. Используется 32-битный код PI C использовать EBX только в качестве регистра указателя GOT, но теперь G CC может выбрать любой удобный регистр и выдать за него функцию thunk, например ....get_pc_thunk.ax
, чтобы конечным функциям не приходилось сохранять / восстанавливать EBX.
P IE делает исполняемые файлы медленнее, возможно, на 15% для 32-битного кода против пары процентов для 64-битного кода. x86-64 имеет RIP-относительную адресацию, что устраняет необходимость в этих блоках. IMO 32-битный P IE не стоит своей цены, если только вам не нужно больше защищаться от атак ROP и Spectre, имея ASLR основного исполняемого файла.