Fingir una ruta de directory sin la ruta completa existente

Estoy trabajando con un sistema de compilation que se basa en routes absolutas para hacer reference a los files fuente, etc. Cuando quiero probar la compilation con diferentes cadenas de herramientas, instalo el directory src en máquinas virtuales o conexiones locales. El problema es que la ruta a mi directory src en mi máquina host es muy compleja, digamos / a / b / c / d / src, y tiene que coincidir con la ruta montada.

Quiero ser capaz de montar mi directory src en algún lugar como / mnt / src, pero siempre termino necesitando crear un enlace simbólico / a / b / c / d / src a / mnt / src, o simplemente tener el punto de assembly en / a / b / c / d / src directamente.

Se siente sucio tener / a / b / c / d en el sistema de files, y en general es posible que ni siquiera tenga permissions para crear files en / a / b / c / d (o en cualquiera de los directorys principales). ¿Hay alguna forma de falsificar este path para apaciguar mi sistema de compilation?

La mejor solución sería enseñarle a ese sistema de compilation que las routes de origen y las routes de installation no son lo mismo, pero supongo que no se puede hacer eso.

El método más directo sería hacer que la ruta de origen sea algo que se pueda reproducir fácilmente, como /var/tmp/mybuild . Si el sistema de compilation no es demasiado desagradable, hacer que este sea un enlace simbólico para ubicar los files debería ser suficiente. Si el sistema de compilation insiste en canonicalizar enlaces simbólicos, deberías poder engañarlo utilizando un enlace de assembly . Con bindfs, no necesita privilegios de root, solo necesita tener permiso de escritura en la location donde desea que aparezcan los files.

Si no puede actuar en el sistema de origen, un enfoque alternativo es precargar una biblioteca dinámica que networkingirige ciertos accesos de files . Esto supone que todos los ejecutables que se ejecutarán están vinculados dinámicamente. El código en el ejemplo vinculado demuestra cómo hacerlo desde un file específico; se puede modificar para networkingirigir todos los files cuya ruta comienza con un cierto prefijo. Reemplazar

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

por algo así como (no probado)

 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; 

Si su objective es evitar contaminar "el host" con residuos de comstackciones de testing, entonces build dentro de un firejail con superposition persistente debería ser una buena opción. Según ese enfoque, se buildía, y tal vez se instalaría, como si fuera real, pero los files terminan en una superposition en lugar de contaminar el sistema de files "real".

Existe la desventaja de que necesitará ubicar los resultados de la testing de construcción dentro de la superposition, pero al mismo time esto tiene la posible ventaja de conservar sucesivos resultados de compilation de testing, por ejemplo, para compararlos, o cualquier otro análisis forense posterior que pueda necesitar para hacer.