Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > chroot


Автор: CPlusPlusFAN 5.6.2009, 01:38
Здравствуйте.
Есть текущая директория. В неё вложена директория root.
В директории root лежит программа a.out. Её исходник:
Код

#include <stdio.h>

int main( int argc, char * argv[] )
{

    FILE * f = fopen( "f.txt", "w" );
    fclose( f );

    f = fopen( "../f.txt", "w" );
    fclose( f );

    f = fopen( "foo/f.txt", "w" );
    fclose( f );

    return 0;
}


В текущей директории лежит программа с исходником:
Код

#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>

int main( int argc, char * argv[] )
{
    int status;
    int pid = fork();

    if ( pid == 0 )
    {
        chdir( "root" );
        
        int res = chroot( "." );
        if ( res == 0 )
            printf( "chroot is success!\n" );
        else
            printf( "error code: %d\n", errno );
        
        
        execl( "a.out", "a.out", NULL, NULL );
        
        exit( 0 );
    }
    
    waitpid( pid, &status, 0 );

    return 0;
}

Эта программа запускается от рута и chroot выполнется. Однако, программа root/a.out не создаёт ни один из файлов. Если вызвать не от рута, то создаются все файлы. Ведь chroot вызван для директории root. Так почему же он блокирует всё?

Спасибо за внимание.

Автор: MAKCim 5.6.2009, 09:22
execve вылетает с ошибкой - ENOENT
это связано с тем, что ядро не может найти динамический компоновщик (ld), который обычно лежит в /lib или /lib64

Автор: CPlusPlusFAN 5.6.2009, 13:32
MAKCim, и что делать тогда?

Автор: CPlusPlusFAN 5.6.2009, 16:55
MAKCim, а можно те либы, которые подключаются на этапе исполнения, вшить в бинарник, чтоб запускалось?
Как её там? libstdc++.so или как-то так.

Автор: CPlusPlusFAN 5.6.2009, 17:12
MAKCim, нашёл решение - компилить исполняемый файл так:
Код

g++ test.cpp -static


правда, бинарник, зараза, вырос. smile 

Автор: MAKCim 6.6.2009, 09:44
CPlusPlusFAN
вопрос решен?

Автор: CPlusPlusFAN 6.6.2009, 10:11
Цитата(MAKCim @  6.6.2009,  09:44 Найти цитируемый пост)
CPlusPlusFAN, 
вопрос решен? 


угу. тему закрываю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)