путь к библиотеке, когда динамично загружено?

Плавание в Microsoft SQL Server эквивалентно Двойному в C#. Причина этого состоит в том, что число с плавающей запятой может только приблизить десятичное число, , точность из числа с плавающей запятой определяет, как точно, что номер приближается десятичное число. Двойной тип представляет двойную точность 64-разрядное число с плавающей запятой со значениями в пределах от отрицания 1.79769313486232e308 к положительному 1.79769313486232e308, а также положительный или отрицательный нуль, PositiveInfinity, NegativeInfinity и Не-число (NaN).

13
задан jldupont 5 November 2009 в 17:43
поделиться

1 ответ

Динамический компоновщик фактически ищет в нескольких местах каждую динамическую библиотеку. К ним относятся (от man ld.so):

  • Пути, заданные переменной окружения LD_LIBRARY_PATH
  • Пути, запеченные в двоичный файл, загружают библиотеку под записью DT_RUNPATH
  • Кэш-файл /etc/ld.so.cache
  • /lib и / usr / lib

Если вы хотите получить путь к определенной разделяемой библиотеке, я бы порекомендовал функцию dladdr . На странице руководства:

Функция dladdr () принимает указатель на функцию и пытается разрешить имя и файл, в котором он находится. Информация хранится в Структура Dl_info :

 typedef struct {
const char * dli_fname; / * Путь к общему объекту, который
 содержит адрес * /
void * dli_fbase; / * Адрес, по которому общий объект
 загружено * /
const char * dli_sname; / * Название ближайшего символа с адресом
 ниже чем адрес * /
void * dli_saddr; / * Точный адрес указанного символа
 в dli_sname * /
} Dl_info;

Если адрес сопоставления символов не найден, тогда dli_sname и dli_saddr имеет значение NULL .

dladdr () возвращает 0 в случае ошибки и ненулевое значение в случае успеха.

Таким образом, вы просто указываете ему указатель на функцию , и он даст вам имя файла, который его предоставляет, и кучу другой информации. Так, например, у вас может быть конструктор в библиотеке, вызывающий это для себя, чтобы узнать полный путь к библиотеке:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>

__attribute__((constructor))
void on_load(void) {
    Dl_info dl_info;
    dladdr((void *)on_load, &dl_info);
    fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}

Эта функция также работает в OS X с той же семантикой.

18
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

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