לדלג לתוכן

פתרון בנייה וקישור

ההרחבה בכותרת מוסיפה את ההכרזות הבאות, יחד עם הכללת stddef.h עבור size_t.

#include <stddef.h>
size_t probe_size(void);
size_t probe_offset(void);

המימוש בקובץ probe.c משתמש במבנה מהכותרת, ולכן שינוי סדר השדות משפיע על שני הצדדים באותה בנייה.

size_t probe_size(void) { return sizeof(struct probe_result); }
size_t probe_offset(void) { return offsetof(struct probe_result, value); }

החליפו ב־build.rs את ה־allowlist של הפונקציות בביטוי probe_.*, והוסיפו ל־src/lib.rs את הבדיקה הבאה.

#[test]
fn generated_layout_matches_c() {
    assert_eq!(unsafe { raw::probe_size() },
               std::mem::size_of::<raw::probe_result>());
    assert_eq!(unsafe { raw::probe_offset() },
               std::mem::offset_of!(raw::probe_result, value));
}

ההכרזה שנוצרה אומרת למקמפל כיצד לקרוא לפונקציה, אבל אינה מספקת את הגוף שלה. בלי ארכיון הסי או ספרייה אחרת שמגדירה את הסימבול, שלב הקישור ייכשל. במקרה של יעד נוסף, תוצאה תקינה של readelf -h מוכיחה רק שהארטיפקט מצהיר על הארכיטקטורה המבוקשת, ואינה מוכיחה שכל התנהגות הספרייה מתאימה למערכת היעד.