كيف يقوم Mach-O Loader بتحميل كائنات NSString مختلفة؟
-
04-10-2019 - |
سؤال
لقد عرفت أنه إذا حددت مجموعة من كائنات nsString في رمز المصدر في Mac OS. سيتم تخزين هذه NSStrings في مقطع في مكتبة Mach-O.
Section
sectname __ustring
segname __TEXT
addr 0x000b3b54
size 0x000001b7
offset 731988
align 2^1 (2)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
إذا قمت بتفريغ الثنائي ، فسيتم محاذاة عن كثب واحدًا تلو الآخر مع أ 0x0000
كما فاصل. ما أريد معرفته هو كيف يتم تحميل المحمل في Mac OS X هذه NSStrings عند تشغيل البرنامج؟ هل تم تحميلهم عن طريق التعرف على 0x0000
فاصل أو هذه جدول إزاحة السلسلة في مكان آخر في الإشارة الثنائية إلى فصل كائنات NSString؟ شكرًا.
(ما أريد فعله حقًا هو زيادة طول أحد NSString ، لذلك يجب أن أعرف كيف يتعرف المحمل على هذه الكائنات المنفصلة)
تمت إضافة: أعرف ما إذا كنت تحدد CSTRINGS مثل @"ABC" في الكود ، فسوف يذهب إلى قطاع CSTRING. إذا كانت سلسلة مثل @"" "مع أحرف ASCII ، فستذهب إلى قسم USTRING وفقًا للحفر.
المحلول
يوجد قسم CSTRING مع جميع الأوتار C المستمرة. كل NSString ثابت يشير فقط إلى واحدة من هذه الأوتار C. يبدو أن البنية C لـ NSString ثابتة مثل هذا:
struct NSConstantString {
Class isa;
char *bytes;
int numBytes;
};
ابحث في __DATA
__cfstring
الجزء.
يحرر:
الجزء __ustring هو ما يعادل قطاع __CString ، باستثناء سلاسل UTF16. لذلك قد يشير NSString الثابت إلى بيانات USTRING أو CSTRING.
الإشارة الوحيدة إلى بيانات USTring هي من المحتمل أن يتم استخدامها بواسطة CFString. إذا قمت بإطالة سلسلة واحدة ، فستشير CFString التي تشير إلى السلسلة التالية بدلاً من ذلك إلى ذيل السلسلة المطولة إلا إذا قمت بإصلاحها. قد تكون قادرًا على العثور على مساحة خالية في مكان آخر يمكنك توجيهها إلى CFString.
نصائح أخرى
لا. كل سلسلة لها عنوان في الثنائي. إذا قمت بإدراج حرف في سلسلة واحدة ، فسيزيد العنوان من جميع العنوان فوقها وستحتاج إلى ضبط عناوينهم أينما تمت الإشارة إليه في الثنائي ، بالإضافة إلى أنك جعلت الجزء أكبر ، ستحتاج لضبط مواقع أي شرائح لاحقة اعتمادًا على مقدار التعبئة الموجودة لمحاذاة القطاع. من الأسهل بكثير إعادة ترجمة البرنامج ودع الرابط يعتني به.
لا يتم تخزين NB NSStrings داخليًا كتسلسلات من C chars. إنها تفاصيل تنفيذ ، لكنني أظن أن NSStrings تستخدم عرض أحرف 16 بت.