Похоже, что функции, о которых вы спрашиваете, local к файлу, в котором они были определены.То есть, похоже, что они были явно предназначены для (и даже не разрешены) для внешнего вызова.
То есть где-то в пределах источника для общей библиотеки libitcl4.0.0.so
, вероятно, появляется объявление вроде:
static tclStubs *ptrlitclStubsPtr;
Это ключевое слово static
указывает, что видимость результирующего символа ptrlitclStubsPtr
ограничена его собственным исходным файлом.
Я выведу все это изтот факт, что ваш вывод readelf
содержит строку
348: 0000000000060f10 8 OBJECT LOCAL DEFAULT 24 ptrlitclStubsPtr
Этот флаг LOCAL
указывает, что символ является локальным.Если бы он был глобальным, предназначенным (и способным) вызываться извне, вместо него появился бы флаг GLOBAL
.
Почему переменные стали частными (static
), как это, поэтому вы не можете их использовать?Это программная технология, «скрытие информации», предназначенная для уменьшения «ширины» интерфейса между вами и библиотекой, такой как libitcl4
.Частные символы более тесно связаны с решениями по реализации в libitcl4
, решениями, которые не должны быть видны вызывающим абонентам или вызывать какие-либо опасения.Предполагается, что если бы у вызывающих абонентов был доступ к этим символам, они также должны были бы знать другие подробности реализации, что означает, что автор libitcl4
не сможет изменить эти подробности реализации, не нарушив (аннулировав) вызывающий код.Поэтому, чтобы предотвратить эту ситуацию, обычно делается выбор, чтобы вызывающая сторона не могла стать зависимой таким образом.
В этой ситуации у вас в основном есть три пути вперед:
Удалите теги static
из объявлений переменных в источниках до libitcl4.0.0.so
.(Это, очевидно, требует, чтобы у вас был доступ к источникам libitcl4.0.0.so
и возможность его перестроить. Это также, вероятно, очень плохая идея. Как я объяснил, эти символы, вероятно, были сделаны статичными по уважительной причине.)
Добавьте новую функцию в libitcl4.0.0.so
, которая делает все, что вам нужно, и которая благодаря своему расположению в том же исходном файле имеет доступ к этим символам.(Это также требует, чтобы у вас был доступ и возможность перестраивать `` libitcl4.0.0.so`.)
Найдите другой способ сделать то, что вам нужно, используясуществующие общественные объекты libitcl4.0.0.so
.