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

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

Сообщение Anonymous »

  • Загрузка самодельной общей библиотеки с помощью ctypes, похоже, каким-то образом обеспечивает доступ к функциям стандартной библиотеки C.
    Почему?
    Я ожидал появления ошибки AttributeError при попытке MRE ниже.
  • Как я мог ограничить такое поведение (если возможно)?
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

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