יום שלישי, אוגוסט 22, 2017

איך libxml2 לימדה אותי לבדוק בינאריים

אני ממש אוהב להשתמש בסיפריות צד שלישי.

זה פשוט , יש אחרים שכתבו את זה וככל הנראה עשו עבודה טובה ממני ויש הרבה יותר משתמשים ממני אז רוב הסיכויים שאם יש באגים הם כבר התגלו ותוקנו בעבר. ועל הדרך אתה לומד דברים חדשים.

בדר"כ כשאני מתחיל להשתמש בסיפריות מספיק לי לראות שאין דיווחי באגים הזויים ורישיון שימוש מתאים, הפעם הייתי צריך להחליף סיפריית בסיס (לא קוד פתוח) בסיפריה פתוחה בחרתי לבנותה מאפס ולאמת את מה שאני מבין.
הצורך שלי היה במשהוא פתוח , פשוט וקל לאחזקה.

זכרתי את ספריית libxml2 כמשהוא פשוט שהשתמשתי בו בפרויקטים שהיו תחת רישיון GPL, אבל הפעם הצורך שלי היה לעמוד ב LGPL ולוודא חיבור דינאמי (dynamic linking) וזאת למרות שlibxml2 תחת רישיון MIT.

בניתי את הסיפריה ושמתי לב שהסיפריה שנוצרה (libxml2_a_dll.lib)  היתה בגודל קרוב לסכום האובייקטים והיתה מעט גדולה מהסיפריה שנוצרה שמיועדת לחיבור סטטי (static linking).

חשדתי בבעיות בנייה, אז לקחתי גם את הבינארים וגם שם קיבלתי תוצאה מעניינת.

בבדיקה באמצעות lib /list libxml2_a_dll.lib פרסה את שמות האובייקטים (במקום לציין את שם ה dll) ו
 link /dump /linkermember libxml2_a_dll.lib

פרסה שמות הערכים הפונקציות והמשתנים ללא _imp או_IMPORT מה שחיזק את ההבנה שלי שמדובר בחיבור סטטי. וזאת למרות שמדובר על dll שאמור להכיל את כל המידע הנדרש.

התיקון לבעיה הוא פשוט - יצרת קובץ def  וקריאה ל lib /def:mydef.def /out:libxml2_trulylgpl.lib.

אין תגובות:

הוסף רשומת תגובה