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