Позволяет переписать вашу программу следующим образом:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv, char **envp)
{
execle("/bin/sh", "sh", "-c", "ls", (char*)NULL, NULL);
return 0;
}
Теперь, как только вы скомпилируете и запустите ltrace , вы увидите следующий фрагмент кода:
<... bsearch resumed> ) = NULL
strlen("ls") = 2
memcpy(0x0061cbe0, "/usr/local/sbin", 15) = 0x0061cbe0
strcpy(0x0061cbf0, "ls") = 0x0061cbf0
__xstat64(1, "/usr/local/sbin/ls", 0x7fffb173e120) = -1
strlen("ls") = 2
memcpy(0x0061cbe0, "/usr/local/bin", 14) = 0x0061cbe0
strcpy(0x0061cbef, "ls") = 0x0061cbef
__xstat64(1, "/usr/local/bin/ls", 0x7fffb173e120) = -1
strlen("ls") = 2
memcpy(0x0061cbe0, "/usr/sbin", 9) = 0x0061cbe0
strcpy(0x0061cbea, "ls") = 0x0061cbea
__xstat64(1, "/usr/sbin/ls", 0x7fffb173e120) = -1
strlen("ls") = 2
memcpy(0x0061cbe0, "/usr/bin", 8) = 0x0061cbe0
strcpy(0x0061cbe9, "ls") = 0x0061cbe9
__xstat64(1, "/usr/bin/ls", 0x7fffb173e120) = -1
strlen("ls") = 2
memcpy(0x0061cbe0, "/sbin", 5)
strcpy(0x0061cbe6, "ls") = 0x0061cbe6
__xstat64(1, "/sbin/ls", 0x7fffb173e120) = -1
strlen("ls") = 2
memcpy(0x0061cbe0, "/bin", 4) = 0x0061cbe0
strcpy(0x0061cbe5, "ls") = 0x0061cbe5
__xstat64(1, "/bin/ls", 0x7fffb173e120) = 0
strlen("ls") = 2
malloc(26) = 0x025fa110
strcpy(0x025fa123, "ls") = 0x025fa123
realloc(NULL, 160) = 0x025fa140
fork()
Как вы можете видеть, он явно ищет правильный путь перед выполнением fork () с '/bin/ls'
, который является правильным путем для 'ls'
. Если задана переменная $PATH
, sh
попытается использовать эти пути, чтобы найти местоположение ls
. Поскольку в этом случае не предусмотрено $PATH
, тем не менее, вероятные пути (например, /bin
, /usr/bin
, /sbin
) пробуются.
С execle
man-page:
Если эта переменная PATH не указана,
путь по умолчанию устанавливается в соответствии с
_PATH_DEFPATH определение в,
который установлен в /usr/bin:/bin.