C++, Как получить имя файла (и путь) выполнения .so модуль в Unix

C++, Как получить имя файла (и путь) выполнения .so модуль в Unix?

Что-то подобное GetModuleFileName в Windows.

5
задан Steve 9 April 2010 в 06:18
поделиться

3 ответа

Хотя это не стандартный интерфейс POSIX, dladdr () Функция доступна во многих системах, включая Linux , Solaris , Darwin / Mac OS X , FreeBSD , HP -UX и IRIX . Эта функция принимает адрес, который может быть, например, указателем на статическую функцию в модуле (если приведен к void * ), и заполняет структуру Dl_info информацией, включая путь к общему объекту, содержащему этот адрес (в элементе dli_fname ).

6
ответ дан 14 December 2019 в 04:33
поделиться

Возможные решения:

  • Список общих библиотек можно найти в файле / proc / {PID} / mmap . Где {PID} - это идентификатор процесса (его можно получить с помощью getpid () ).
  • Вызов инструмента командной строки ldd для двоичного файла программы (хранящегося в argv [0] ).
  • Если вы пишете решение с нуля, посмотрите исходный код команд ldd из uClibc , как получить список общих библиотек из двоичного файла elf.
0
ответ дан 14 December 2019 в 04:33
поделиться

К сожалению, это невозможно сделать с помощью UNIX или POSIX. Если вам нужно использовать его для поиска каких-либо данных, вы должны использовать переменную среды $ PATH и искать данные по пути, относящемуся к каждой записи в $ PATH. Например, нередко хранить двоичные файлы в « installdir / bin» для некоторого установочного каталога «installdir» и хранить связанные данные в « installdir / share / имя_программы "для некоторого каталога установки и некоторой программы с именем" имя_программы ". Если это так, то просмотр «../share/name_of_program[113540 sizes/name_of_resource_file] относительно каждой записи в getenv (« ПУТЬ ») является хорошим способом поиска ресурсов. . Еще одна вещь, которую вы можете сделать, - это разрешить предоставление необходимой информации в командной строке или в каком-либо файле конфигурации и выполнять поиск только в случае необходимости в качестве альтернативного варианта.

Edit
Теперь, когда вы изложили свое обоснование этого, я бы посоветовал вам просто использовать класс QSettings из Qt для информации о конфигурации, поскольку он использует предпочтительный собственный механизм для каждого платформа (реестр в Windows, файл PLIST в Mac OS X, база данных Gnome GConf в Linux). Вы можете взглянуть на мой Шаблон проекта C ++ , поскольку он использует Qt для этого и предоставляет простые параметры командной строки для легкой настройки параметров конфигурации ("--prefset", "--prefget "и" --preflist "управляют настройками QSettings).

Тем не менее, если вам абсолютно необходимо использовать собственный XML-файл конфигурации вместо предпочтительного собственного механизма, я настоятельно рекомендую вам поместить общесистемную конфигурацию в « installdir / etc», в то время как размещение вашей библиотеки в « installdir / lib» для некоторого установочного каталога «installdir», поскольку это типичное место для файлов конфигурации в системах UNIX, а « installdir / lib» следует ТОЛЬКО использоваться для файлов библиотеки, а не для файлов конфигурации и других ошибок. Я предлагаю вам поместить пользовательскую версию файла конфигурации в «$ XDG_CONFIG_HOME» (если он определен) или в «$ HOME / .config» (где «$ HOME» - это домашняя папка пользователя).

При поиске общесистемного файла конфигурации я бы рекомендовал искать в $ XDG_CONFIG_DIRS, если он определен; если он не определен, возврат к «/ etc / xdg» или поиск «../etc/name_of_your_program.conf.xml» относительно «$ PATH» и, возможно, также относительно «$ LD_LIBRARY_PATH», » $ DYLD_LIBRARY_PATH, $ DYLD_FALLBACK_LIBRARY_PATH), содержимое «/etc/ld.so.conf», если оно существует, и содержимое «/etc/ld.so.conf.d/*.conf», если эти файлы существуют, остановка поиска, как только вы встретите первый действительный такой файл конфигурации, будет разумным подходом.

Благодарим Роджера за указание на XDG Basedir Spec и за отличную конструктивную критику.

2
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

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