Ограничение символов в Linux статическая библиотека

Вы можете использовать Promise.all , чтобы дождаться завершения набора обещаний.

getData()
  .then(getIndividualData)
  .then(function(moreResponse) {
    // the result of the individual calls produced by getIndividualData();
    console.log(moreResponse);
   });

function getIndividualData(list) {
  var tasks = list.map(function(item) {
    options.url = // etc.
    return request(options);
  });

  return Promise.all(tasks);
}

23
задан 26 December 2008 в 16:48
поделиться

4 ответа

Статические библиотеки не могут сделать то, что Вы хотите для кода, скомпилированного или с GCC 3.x или с 4.x.

, Если можно использовать общие объекты (библиотеки), компоновщик GNU делает то, в чем Вы нуждаетесь с функцией, названной сценарием версии. Это обычно используется для обеспечения определенных для версии точек входа, но вырожденный случай просто различает общедоступные и частные символы без любого управления версиями. Сценарий версии определяется с - сценарий версии = параметр командной строки к ld.

содержание сценария версии, который обнародовал нечто точек входа и панель и скрывает все другие интерфейсы:

{ global: foo; bar; local: *; };

См. ld документ в: http://sourceware.org/binutils/docs/ld/VERSION.html#VERSION

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

документ А, который обеспечивает больше преимуществ общих объектов, но записанный для Соляриса (Greg Nakhimovsky счастливой памяти), в http://developers.sun.com/solaris/articles/linker_mapfiles.html

, я надеюсь, что это помогает.

11
ответ дан Jonathon Reinhart 29 November 2019 в 02:36
поделиться

Я не полагаю, что GNU ld имеет любые такие опции; Ulrich, должно быть, имел в виду objcopy, который имеет много таких опций: --localize-hidden, --localize-symbol=symbolname, --localize-symbols=filename.

--localize-hidden в особенности позволяет иметь очень точный контроль, по которому представлены символы. Рассмотрите:

int foo() { return 42; }
int __attribute__((visibility("hidden"))) bar() { return 24; }

gcc -c foo.c
nm foo.o
000000000000000b T bar
0000000000000000 T foo

objcopy --localize-hidden foo.o bar.o
nm bar.o
000000000000000b t bar
0000000000000000 T foo

Так bar() больше не экспортируется из объекта (даже при том, что он все еще присутствует и применим для отладки). Вы могли также удалить bar() все вместе с objcopy --strip-unneeded.

10
ответ дан Employed Russian 29 November 2019 в 02:36
поделиться

Мой способ сделать его состоит в том, чтобы отметить все, что не должно быть экспортировано с ВНУТРЕННИМ, включать, охраняют все.h файлы, компилируют сборки dev с-DINTERNAL = и компилируют сборки конечных версий с единственным.c файлом, который включает всю другую библиотеку.c файлы с-DINTERNAL=static.

0
ответ дан Joshua 29 November 2019 в 02:36
поделиться

Это уточнение ответов от EmployedRussian и JonChesterfield, которые могут быть полезны, если вы генерируете как динамические, так и статические библиотеки.

Начните со стандартного механизма скрытия символов в DSO (динамическая версия вашей библиотеки). Скомпилируйте все файлы с помощью -fvisibility=hidden. В заголовочном файле, который определяет ваш API, измените объявления классов и функций, которые вы хотите сделать общедоступными:

   #define DLL_PUBLIC __attribute__ ((visibility ("default")))
   extern DLL_PUBLIC int my_api_func(int);

См. здесь для получения подробной информации. Это работает как для C, так и для C ++. Этого достаточно для DSO, но вам нужно добавить следующие шаги сборки для статических библиотек:

ld -r obj1.o obj2.o ... objn.o -o static1.o
objcopy --localize-hidden static1.o static2.o
ar -rcs mylib.a static2.o

Шаг ar является необязательным - вы можете просто связать с static2.o.

1
ответ дан EML 29 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

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