Ответ 1
Я ожидал, что основная ошибка завершится неудачей, поскольку $ORIGIN не расширяется в приложениях setuid. Удивительно, но это работает.
Glibc имеет длинную историю расширения $ORIGIN
даже для двоичных файлов suid (см., например, CVE-2010-3847). Мотивация заключается в том, что суицидальные двоичные файлы, использующие $ORIGIN
для rpath, разбиты по дизайну, поэтому разработчикам Glibc никогда не очень хотелось это исправлять. Некоторые дистрибутивы, расположенные ниже по потоку, предоставляют исправления на складе Glibc, которые отключают расширение ORIGIN, поэтому точное соответствие зависит от вашего дистрибутива.
Забавно, только свободностоящий $ORIGIN
будет расширен - если вы замените его, например. $ORIGIN/libs
он начнет сбой.
Почему это работает, когда я запускаю main из его содержащей директории?
Как только вы переместите файл, $ORIGIN будет разворачиваться в другую папку, которая больше не содержит требуемую библиотеку.