2015-11-07 5 views
14

Я работаю над патчем для FFmpeg и должен отлаживать свой код. Я загружаю внешнюю библиотеку, и для того, чтобы протестировать разные версии библиотеки, я имею их в разных папках. Чтобы выбрать тот, который я хочу использовать, я использовал DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg, и это работает нормально. Но когда я пробую его в пределах lldb, он падает с dyld: Library not loaded и Reason: image not found. Это использовалось для работы с pre-Xcode 7.1, но я недавно обновился и перестала работать.Почему lldb больше не перенаправляет переменную окружения?


Вот мой MVCE:

#include <stdio.h> 
#include <stdlib.h> 

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

Запуск этой программы следующим образом выводит:

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

Это выглядит хорошо. Но когда я пытаюсь использовать lldb он не:

$ 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) 

Попытка установить переменную окружения внутри lldb работы:

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) 

lldb версия (это из Xcode 7.1):

$ lldb --version 
lldb-340.4.110 

Вопрос: Является ли это новой «особенностью», или это новая ошибка в lldb (или я абсолютно сумасшедший, и это никогда не работало)? Я вполне уверен, что lldb используется для перенаправления переменной окружения DYLD_LIBRARY_PATH, так как это уже не так?


Редактировать: Это на OS X 10.11.1.

+1

Подтверждено [здесь] (https://www.mail-archive.com/[email protected]/msg00779.html) от Jason Molenda (который, кажется, является одним из разработчиков lldb). –

ответ

23

Если это на El Capitan (OS X 10.11), то это почти наверняка является побочным эффектом защиты целостности системы. Из System Integrity Protection Guide: Runtime Protections статьи:

Когда запускается процесс, то ядро ​​проверяет, является ли основным исполняемого защищенный на диске или подписан с специальной системой предоставления прав. Если либо истинно, то флаг установлен, чтобы обозначить, что он защищен от модификации. ...

... Любой динамический компоновщик (dyld) переменные окружения, такие как DYLD_LIBRARY_PATH, удаляются при запуск защищенных процессов.

Все в/usr/bin защищено таким образом. Поэтому, когда вы вызываете/usr/bin/lldb, все переменные среды DYLD_ * очищаются.

Он должен работать, чтобы запустить lldb изнутри Xcode.app или инструментов командной строки, например:

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

Я не верю, что копия lldb защищена./usr/bin/lldb на самом деле просто батут, который выполняет версию в Xcode или Command Line Tools, так что вы в конечном счете используете то же самое. Но/usr/bin/lldb защищен, поэтому переменные среды DYLD_ * очищаются при его запуске.

В противном случае вам придется установить переменную окружения внутри lldb, как показано Грегом Клейтоном в этой теме, которую вы связали. Или вы можете отключить защиту целостности системы, хотя она служит хорошей цели.

+0

Да, это на OS X 10.11.1. Это интересно. Спасибо за четкое объяснение! – Cornstalks

+2

Спасибо. Это также решает мою проблему (на El Capitan). Я создал псевдоним 'alias lldb =/Applications/Xcode.app/Contents/Developer/usr/bin/lldb' для облегчения ввода. –