Как определить собраны ли исполняемые файлы с реализацией технологии PIE или нет
Дано — ОС FreeBSD 14.1-current amd64
В ports/Mk/bsd.serenity.mk есть строка
WITH_PIE= yes
Собираю порт sysutils/kdialog и сохраняю отдельно.
В файле ports/Mk/bsd.serenity.mk в строку WITHOUT_PIE_PORTS= добавляю sysutils/kdialog
Собираю заново и сравниваю с предыдущим вариантом — в папке stage все файлы одинаковы. Повторяю тоже самое для пакета math/kcalc. Тут тоже все файлы одинаковы, кроме файлов index.cache.bz2 в stage/usr/local/share/doc/HTML/<ca,de,en,…,uk>.
Вот и возник вопрос — так собираются ли файлы с реализацией технологии PIE или нет, если их значение не меняется от указания собирать с PIE или без.
Пошёл далее - такое же сделал с пакетом editors/vim — тут бинарные файлы отличаются друг от друга, более того для варианта, что собирался с поддержкой PIE технологии получаю
$ readelf -a vim |grep PIE
0x000000006ffffffb FLAGS_1 PIE
Под Linux можно было бы радоваться, но под FreeBSD не всё так просто (если верить результатам гугления) — и я решил проверить ещё.
Сделал программу helloworld и собрал её с ключиком -fPIE и с ключом -fno-PIE. Результат просмотрел с помощью readelf — в обоих случаях флаг PIE не установлен, хотя дизассемлирование и просмотр кода явно показывает отличие в коде.
00000000002017b0 <main>:
2017b0: 55 push rbp
2017b1: 48 89 e5 mov rbp, rsp
2017b4: 48 83 ec 10 sub rsp, 0x10
2017b8: 48 8d 7d f0 lea rdi, [rbp - 0x10]
2017bc: e8 1f 01 00 00 call 0x2018e0 <time@plt>
2017c1: bf 99 05 20 00 mov edi, 0x200599
2017c6: e8 25 01 00 00 call 0x2018f0 <puts@plt>
2017cb: bf 99 05 20 00 mov edi, 0x200599
======
00000000002017b0 <main>:
2017b0: 55 push rbp
2017b1: 48 89 e5 mov rbp, rsp
2017b4: 53 push rbx
2017b5: 48 83 ec 18 sub rsp, 0x18
2017b9: 48 8d 7d e8 lea rdi, [rbp - 0x18]
2017bd: e8 0e 01 00 00 call 0x2018d0 <time@plt>
2017c2: 48 8d 1d d0 ed ff ff lea rbx, [rip - 0x1230] # 0x200599 <.rodata+0x1>
2017c9: 48 89 df mov rdi, rbx
Но может ли это отличие быть однозначно показывать на использование технологии PIE — не ясно.
Пробовал разобраться с помощью пакета radare2 — но там тоже самое, что и с readelf, objdump и elfdump — сплошная неопределённость — не ясно собран бинарник с реализацией технологии PIE или нет