Ответ (или, по крайней мере, запускается ]) в fs / proc / base.c
(не изменилось, по крайней мере, с версии ядра 3.12 до версии 4.2)
742 static int proc_pid_permission(struct inode *inode, int mask)
743 {
744 struct pid_namespace *pid = inode->i_sb->s_fs_info;
745 struct task_struct *task;
746 bool has_perms;
747
748 task = get_proc_task(inode);
749 if (!task)
750 return -ESRCH;
751 has_perms = has_pid_permissions(pid, task, 1);
752 put_task_struct(task);
753
754 if (!has_perms) {
755 if (pid->hide_pid == 2) {
756 /*
757 * Let's make getdents(), stat(), and open()
758 * consistent with each other. If a process
759 * may not stat() a file, it shouldn't be seen
760 * in procfs at all.
761 */
762 return -ENOENT;
763 }
764
765 return -EPERM;
766 }
767 return generic_permission(inode, mask);
768 }
Приведенный выше код является отправной точкой для определения наличия конкретного / proc / PID
запись существует или нет. Когда hide_pid
установлен в 2, он возвращает -ENOENT
, если у вас нет необходимых разрешений. Разрешения проверяются с помощью:
has_pid_permissions ()
→
ptrace_may_access ()
→
__ ptrace_may_access ()
__ ptrace_may_access ()
запрещает доступ, потому что процесс не является "дампируемым", поскольку он был создан из нечитаемого исполняемого образа, как определено во время создания процесса:
setup_new_exec ()
→
would_dump ()
1118 void would_dump(struct linux_binprm *bprm, struct file *file)
1119 {
1120 if (inode_permission(file_inode(file), MAY_READ) < 0)
1121 bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
1122 }
Вы используете более новую версию libstdc++6
, чем предусмотрено вашим дистрибутивом. Если вы хотите правильно использовать пакеты своего дистрибутива, вам следует вернуться к:
sudo apt install libstdc++6=4.8.4-2ubuntu1~14.04.4