Почему ctypes также загружает стандартные функции библиотеки C и как я могу это предотвратить?Python

Программы на Python
Ответить
Anonymous
 Почему ctypes также загружает стандартные функции библиотеки C и как я могу это предотвратить?

Сообщение Anonymous »

  • Загрузка самодельной общей библиотеки с помощью ctypes, похоже, каким-то образом обеспечивает доступ к функциям стандартной библиотеки C.
    Почему?
    Я ожидал появления ошибки AttributeError при попытке MRE ниже.
  • Как я мог ограничить такое поведение (если возможно)?
  • [тайбрейкер] : как разрешается имя функции при попытке доступа к ней, и если моя самоделка переопределяет стандартная функция библиотеки C?
Насколько я понимаю из документации, она должна возвращать представление загруженной общей библиотеки. Но похоже, что он ведет себя как нечто большее/иное, чем это.

MRE:
  • test.py
#!/usr/bin/env python3

import ctypes
import os

my_lib = ctypes.CDLL(os.path.abspath("libfoo.so"))

# I expect this to work (It does).
print(f"{my_lib.foo = }")
# I expect this to fail (It doesn't).
print(f"{my_lib.strncmp = }")
# I expect this to fail (It does).
print(f"{my_lib.bar = }")
  • foo.s:
global foo

foo:
ret
  • сеанс оболочки:
$ make
nasm -f elf64 -o foo.o foo.s
gcc -shared -o libfoo.so foo.o
$ nm -a libfoo.so
0000000000000000 a
w __cxa_finalize@GLIBC_2.2.5
0000000000004000 d __dso_handle
0000000000003e48 d _DYNAMIC
00000000000010f4 t _fini
00000000000010f0 T foo
0000000000000000 a foo.s
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
0000000000001000 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000004008 d __TMC_END__
$ ./test.py
my_lib.foo =
my_lib.strncmp =
Traceback (most recent call last):
File "/home/vmonteco/code/MREs/MRE_ctypes_give_access_to_stdlib/./test.py", line 13, in
print(f"{my_lib.bar = }")
File "/home/vmonteco/.pyenv/versions/3.10.14/lib/python3.10/ctypes/__init__.py", line 387, in __getattr__
func = self.__getitem__(name)
File "/home/vmonteco/.pyenv/versions/3.10.14/lib/python3.10/ctypes/__init__.py", line 392, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /home/vmonteco/code/MREs/MRE_ctypes_give_access_to_stdlib/libfoo.so: undefined symbol: bar
$


Подробнее здесь: https://stackoverflow.com/questions/790 ... -prevent-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»