LINUX.ORG.RU

gcc -no-pie on clang

 ,


0

2

Привет всем!

Собираю приложение из нескольких модулей при помощи cmake. Чтобы из файлового менеджера в иксах бинарник «запускался» кликом мышки, указываю для «CMAKE_CXX_FLAGS» одним из параметров "-no-pie". При сборке GCC проблем нет. Но тут захотелось нового...

Пытаюсь собрать clang-ом с параметром "-fno-PIE", все модули выдают ошибку:

/usr/bin/ld: CMakeFiles/appdbg_clang.dir/src/io.cpp.o: перемещение R_X86_64_32 для «.rodata.str1.1» не может использоваться при создании объект PIE; recompile with -fPIE

и результирующий файл не собирается. А без "-fno-PIE" файл собирается как исполняемый, но не кликабельный из иксов.

Кто имеет опыт работы со «шлангом», подскажите, что почитать?

---

РЕШЕНИЕ: использовать в CMakefile.txt не «CMAKE_CXX_FLAGS», а опцию:

SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie" )

Рабочий пример кода можно посмотреть тут: https://github.com/bigov/daft-lib/tree/master/gui_samples/gtkmm


Чтобы из файлового менеджера в иксах бинарник «запускался» кликом мышки, указываю для «CMAKE_CXX_FLAGS» одним из параметров «-no-pie»

Это не для этого, это просто рандомизация места в памяти при запуске

Пытаюсь собрать clang-ом с параметром «-fno-PIE», все модули выдают ошибку:

Значит зависимость или модуль какой не собраны с этим. Везде fPIC обычно

и результирующий файл не собирается. А без «-fno-PIE» файл собирается как исполняемый, но не кликабельный из иксов.

Эмм «chmod +x ./my_app;»

собирается как исполняемый, но не кликабельный из иксов

А вот тут как и в самом начале про закавыченное «запускался» я не понял. Подписался. Жду знатоков.

LINUX-ORG-RU ★★ ()

А без «-fno-PIE» файл собирается как исполняемый, но не кликабельный из иксов.

обновить дистрибутив и использовать нормальный файловый менеджер, чтобы у донных DE вообще доля использования упала в 0.

В актуальном nautilus(файловый менеджер Gnome3) нормально запускаются pie executables по дабл клику…

fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

древние файл менеджеры не отличали pie executable от shared library, и по дабл клику не запускали программу

Чуток уточню.

so-либы как-бы можно запускать, но только они падают в корку, потому-что TL;DR гладиолус…

Соответственно файловым менеджерам пришлось научиться отличать so-файлы от всех прочих (иначе юзвери кликали и засыпали всех багрепортами «оно падает!»).

Так вот, старые файловые менеджеры «глядя» на PIE видят so-либу и не дают пользователю сделать плохого. Нормальный выход только один - обновляться на актуальные версии, а не биться с PIE.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

so-либы как-бы можно запускать, но только они падают в корку

[del@thinkpad ~]$ /lib/x86_64-linux-gnu/libc.so.6 
GNU C Library (Debian GLIBC 2.29-9) stable release version 2.29.
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 9.2.1 20200104.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
[del@thinkpad ~]$ 

Никто не упал в корку, все живы.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от bigov

Ерунда. См. выше.

https://bugzilla.redhat.com/show_bug.cgi?id=1296868 https://bugzilla.gnome.org/show_bug.cgi?id=737849 https://bugs.freedesktop.org/show_bug.cgi?id=97226 https://bugzilla.xfce.org/show_bug.cgi?id=13737

Я правильно понимаю что вы хотите иметь свою версию реальности?

На всякий - я был не прав, предполагая что этот куст багов (у всех примерно одна причина) исправили в последних релизах.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Нет, дело не в этом. Ради интереса скачал исходники игрового движка Godot и собрал его клангом. И что бы вы думали? Файловый менеджер определяет собранный бинарник как «тип файла: Исполняемый» и нормально запускает его без ярлыка. Что на это скажете, тоже «версия реальности»?

Вот только у него сборочная система не cmake, поэтому пока разбираюсь…

bigov ()