libc ++ обеспечивает строгое определение оператора нового в Дарвине - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь заменить оператор new и удалить в приложении ios, которое я строю. Это работает, когда я работаю под симулятором, но при развертывании на реальном устройстве я не ловлю все звонки оператору new. Я полагаю, что это связано с тем, что libc ++ связан с динамически и предоставляет собственное строгое определение оператора new.

SM-zturner:Downloads zturner$ objdump -t "/Users/zturner/Library/Developer/Xcode/iOS DeviceSupport/13.3.1 (17D50) arm64e/Symbols/usr/lib/libc++.1.dylib" | grep __Znwm
0000000000000000  w      *UND*  __Znwm
0000000000000000  w      *UND*  __ZnwmRKSt9nothrow_t
0000000000000000  w      *UND*  __ZnwmSt11align_val_t
0000000000000000  w      *UND*  __ZnwmSt11align_val_tRKSt9nothrow_t
000000000001baff g       *UND*  __Znwm
000000000001bb1b g       *UND*  __ZnwmRKSt9nothrow_t
000000000001bb46 g       *UND*  __ZnwmSt11align_val_t
000000000001bb80 g       *UND*  __ZnwmSt11align_val_tRKSt9nothrow_t
SM-zturner:Downloads zturner$

Однако, когда я сравниваю это с версией libc ++. Dylib, которая используется при запуске под симулятором мы видим, что нет строгого определения оператора new.

SM-zturner:Downloads zturner$ objdump -t /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libc++.1.dylib | grep __Znwm
0000000000000000  w    *UND* __Znwm

только слабое определение. Если я создаю собственное приложение, я вижу, что у меня также есть четкое определение.

, поэтому мой вопрос: как это должно работать? Мне нужно, чтобы мой operator new имел приоритет над libc ++. На всех других платформах libc ++ скрывает все символы. Например, в Linux:

zturner@ubuntu:~$ objdump -t /usr/lib/x86_64-linux-gnu/libc++.so.1.0

/usr/lib/x86_64-linux-gnu/libc++.so.1.0:     file format elf64-x86-64

SYMBOL TABLE:
no symbols

Есть ли что-то, что я могу передать компоновщику, или какой-то атрибут, который я могу установить в коде, чтобы убедиться, что мое определение используется поверх определения внутри libc ++. Dylib?

...