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;