Fingindo um caminho de diretório sem o caminho completo existente

2

Estou trabalhando com um sistema de compilação que depende de caminhos absolutos para fazer referência a arquivos de origem, etc. Quando quero testar a compilação com diferentes toolchains, montei o diretório src em VMs ou chroots. O problema é que o caminho para o meu diretório src em minha máquina host é muito complexo - digamos / a / b / c / d / src - e ele precisa corresponder ao caminho montado.

Eu quero montar meu diretório src em algum lugar como / mnt / src, mas eu sempre acabo precisando criar um link simbólico / a / b / c / d / src para / mnt / src, ou apenas o ponto de montagem em / a / b / c / d / src diretamente.

Parece sujo ter / a / b / c / d no sistema de arquivos, e em geral você pode nem ter permissões para criar arquivos em / a / b / c / d (ou qualquer um dos diretórios pai). Existe alguma maneira de falsificar este caminho para apaziguar o meu sistema de compilação?

    
por tomKPZ 19.11.2017 / 21:52

2 respostas

2

A melhor solução seria ensinar que o sistema de construção que os caminhos de origem e os caminhos de instalação não são a mesma coisa, mas eu suponho que você não pode fazer isso.

O método mais direto seria organizar o caminho de origem para algo que possa ser facilmente reproduzido, como /var/tmp/mybuild . Se o sistema de compilação não for muito desagradável, tornar isso um link simbólico para onde os arquivos estão localizados deve ser suficiente. Se o sistema de compilação insiste em canonizar links simbólicos, você deve ser capaz de enganá-lo usando uma vincular montagem em vez disso. Com bindfs, você não precisa de privilégios de root, você só precisa ter permissão de escrita no local onde você quer que os arquivos apareçam.

Se você não puder atuar no sistema de origem, uma abordagem alternativa será pré-carregue uma biblioteca dinâmica que redirecione certos acessos a arquivos . Isso pressupõe que todos os executáveis que serão executados sejam vinculados dinamicamente. O código no exemplo vinculado demonstra como fazer isso de um arquivo específico; Ele pode ser ajustado para redirecionar todos os arquivos cujo caminho começa com um determinado prefixo. Substituir

if (!strcmp(path, FROM)) {
    path = TO;
}
…
return ret;

por algo como (não testado)

char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
    other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
    if (other_path == NULL) return -ENOENT; // return NULL in fopen
    memcpy(other_path, TO, strlen(TO));
    memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
    path = other_path;
}
…
free(other_path);
return ret;
    
por 19.11.2017 / 23:25
0

Se o seu objetivo é evitar poluir "o host" com resíduos de compilações de teste, a criação dentro de uma sobreposição firejail com persistente deve ser uma boa opção. Por essa abordagem, ele criaria, e talvez instalaria, como se fosse real, mas os arquivos acabam em uma sobreposição em vez de poluir o sistema de arquivos "real".

Existe a desvantagem de precisar localizar resultados de compilação de teste na sobreposição, mas ao mesmo tempo isso tem a possível vantagem de preservar resultados de compilação de teste sucessivos, por exemplo, para compará-los ou qualquer outra forense posterior pode precisar fazer.

    
por 19.11.2017 / 22:26