Символьная путаница в динамически связанной библиотеке, когда код приложения имеет один и тот же символ [дубликат]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

Обратный вызов ...args завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

2
задан raj_gt1 6 May 2015 в 14:59
поделиться

2 ответа

В динамической привязке добавляется функция «видимость символа» . По существу это позволяет выставлять только определенные символы в объекте (объект в смысле shared object ) границы. Хороший стиль заключается в том, чтобы скомпилировать и связать общие объекты с скрытыми по умолчанию символами и только разоблачить их явно, которые требуются вызываемыми лицами.

Визуализация символа применяется во время связывания и пока применяется только в динамических компоновщиках. Разумеется, возможно также иметь его в статической связи, вариант GCC от Apple реализует так называемые файлы перемещения перемещаемых файлов Mach-O , которые могут быть статически связаны с применяемой видимостью. Но я не знаю, может ли ванильный GCC, binutils ld или золотой линкер сделать это для простого старого ELF.

2
ответ дан datenwolf 25 August 2018 в 13:23
поделиться

Динамическое связывание в современной Linux и нескольких других операционных системах основано на двоичном формате ELF. Динамические библиотеки (ELF), на которые полагается исполняемая или другая разделяемая библиотека, имеют приоритет. Чтобы разрешить данный символ, динамический компоновщик проверяет каждую библиотеку в порядке приоритета, пока не найдет тот, который определяет символ.

Это может быть рискованным, когда несколько динамических объектов определяют один и тот же символ, а также несколько динамических объектов используйте этот символ. Тогда может случиться так, что символ по-разному разрешен в разных динамических объектах.

Полная информация не подходит для SO, но я не знаю лучшего технического объяснения, кроме того, что в статье Ульриха Дреппера " Как писать общие библиотеки ".

4
ответ дан John Bollinger 25 August 2018 в 13:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: