Изящно обрабатывать неудачную привязку ленивых символов в C? - PullRequest
0 голосов
/ 04 июня 2019

Короче, я ищу способ справиться с этим без сбоев процесса:

dyld: lazy symbol binding failed: Symbol not found: _evalstring
  Referenced from: /Users/nrser/src/gh/nrser/my_first_ext/ext/my_first_ext/my_first_ext.bundle
  Expected in: flat namespace

dyld: Symbol not found: _evalstring
  Referenced from: /Users/nrser/src/gh/nrser/my_first_ext/ext/my_first_ext/my_first_ext.bundle
  Expected in: flat namespace

./bin/console: line 2: 69989 Abort trap: 6           bundle exec pry -f -r my_first_ext

Есть ли способ узнать, присутствует ли evalstring перед выполнением вызова, или перехватить ошибку в функции и вернуть что-то еще?

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

Для контекста, у меня есть некоторый C, который работает как внутри Bash, "загружаемого", где доступен Bash's evalstring, так и вне его, где evalstring нет.

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

Подробнее

Функция evalstring объявлена ​​как

extern int evalstring __P((char *, const char *, int));

в <BASH_DIR>/include/bash/builtins/common.h, по крайней мере, так, как думает моя IDE.

Я понимаю, что переносимость может быть проблемой. В настоящее время я ориентируюсь на Linux и macOS / OSX.

1 Ответ

1 голос
/ 04 июня 2019

По крайней мере в Linux единственный способ добиться этого - предоставить собственную оболочку, которая перехватывает вызовы к evalstring, а затем перенаправляет их на фактическую реализацию, полученную с помощью dlsym, или дает сбой в зависимости от приложения. Такие оболочки могут быть реализованы вручную или (если вам нужно добиться этого для всех функций в некоторой библиотеке) с помощью сценария (например, см. Генератор оболочек Implib.so ).

...