- Загрузка самодельной общей библиотеки с помощью 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
$
- )
Код: Выделить всё
uname -a: Архлинукс (Linux vmonteco-P15 6.10.10-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 12 Sep 2024 17:21:02 +0000 x86_64 GNU/Linux - : Python 3.10.14
Код: Выделить всё
python - : версия NASM 2.16.03, скомпилированная 4 мая 2024 г.
Код: Выделить всё
nasm - : gcc (GCC) 14.2.1 20240910
Код: Выделить всё
gcc - : GNU ld (GNU Binutils) 2.43.0
Код: Выделить всё
ld
Подробнее здесь: https://stackoverflow.com/questions/790 ... -prevent-t