¿Por qué lldb ya no reenvía mi variable de entorno?

Estoy trabajando en un parche para FFmpeg y necesito depurar mi código. Estoy cargando una biblioteca externa, y para probar diferentes versiones de la biblioteca, las tengo en diferentes carpetas. Para seleccionar cuál quiero usar, he estado usando DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg y eso funciona bien. Pero cuando lo bash dentro de lldb , se bloquea diciendo dyld: Library not loaded y Reason: image not found . Esto solía funcionar antes de Xcode 7.1, pero acabo de actualizarlo recientemente y dejó de funcionar.


Aquí está mi MVCE:

 #include  #include  int main() { char* str = getenv("DYLD_LIBRARY_PATH"); if (str) puts(str); else puts("(null)"); return 0; } 

Ejecutando este progtwig de la siguiente manera produce la salida:

 $ ./a.out (null) $ DYLD_LIBRARY_PATH=/tmp ./a.out /tmp 

Eso se ve bien. Pero cuando bash usar lldb falla:

 $ DYLD_LIBRARY_PATH=/tmp lldb ./a.out (lldb) target create "./a.out" Current executable set to './a.out' (x86_64). (lldb) run Process 54255 launched: './a.out' (x86_64) (null) Process 54255 exited with status = 0 (0x00000000) 

Intentando establecer la variable de entorno dentro de lldb works:

 lldb ./a.out (lldb) target create "./a.out" Current executable set to './a.out' (x86_64). (lldb) env DYLD_LIBRARY_PATH=/tmp (lldb) run Process 54331 launched: './a.out' (x86_64) /tmp Process 54331 exited with status = 0 (0x00000000) 

Versión lldb (es de Xcode 7.1):

 $ lldb --version lldb-340.4.110 

Pregunta: ¿Es esta una nueva “función” prevista o es un error nuevo en lldb (o estoy totalmente loco y esto nunca solía funcionar)? Soy bastante positivo. Lldb solía reenviar la variable de entorno DYLD_LIBRARY_PATH , ¿por qué ya no lo es?


Edición: Esto está en OS X 10.11.1.

Si se trata de El Capitán (OS X 10.11), es casi seguro que es un efecto secundario de la Protección de la integridad del sistema. De la guía de protección de integridad del sistema: artículo sobre las protecciones en tiempo de ejecución :

Cuando se inicia un proceso, el kernel verifica si el ejecutable principal está protegido en el disco o está firmado con un derecho especial del sistema. Si cualquiera de las dos es verdadera, entonces se establece un indicador para indicar que está protegido contra la modificación. …

… Todas las variables de entorno del enlazador dynamic ( dyld ), como DYLD_LIBRARY_PATH , se DYLD_LIBRARY_PATH al iniciar procesos protegidos.

Todo en / usr / bin está protegido de esta manera. Por lo tanto, cuando invoca / usr / bin / lldb, todas las variables de entorno DYLD_ * se eliminan.

Debería funcionar para ejecutar lldb desde Xcode.app o las herramientas de línea de comandos, así:

 DYLD_LIBRARY_PATH=whatever /Applications/Xcode.app/Contents/Developer/usr/bin/lldb  

No creo que la copia de lldb esté protegida. / usr / bin / lldb es en realidad solo un trampolín que ejecuta la versión en Xcode o las Herramientas de línea de comando, por lo que finalmente está ejecutando lo mismo. Pero / usr / bin / lldb está protegido por lo que las variables de entorno DYLD_ * se eliminan cuando se ejecuta eso.

De lo contrario, tendrá que establecer la variable de entorno dentro de lldb como lo muestra Greg Clayton en ese hilo que vinculó. O bien, puede deshabilitar la protección de integridad del sistema, aunque tiene un buen propósito.