110 likes | 218 Views
Shared Libraries. תכנות מתקדם 2 89-211 תרגול מספר 4 תש"ע 2009-2010. אליהו חלסצ'י. למה צריך ספריות משותפות? שימוש ברכיבים סטנדארטיים. Reuse לקוד. עבודה במקביל של כמה מתכנתים. ניתן לקמפל רק את הרכיב שהשתנה, ולבצע linkage מחדש, בלי הצורך לקמפל את הכל שוב.
E N D
Shared Libraries תכנות מתקדם 2 89-211תרגול מספר 4 תש"ע 2009-2010 אליהו חלסצ'י
למה צריך ספריות משותפות? שימוש ברכיבים סטנדארטיים. Reuse לקוד. עבודה במקביל של כמה מתכנתים. ניתן לקמפל רק את הרכיב שהשתנה, ולבצע linkage מחדש, בלי הצורך לקמפל את הכל שוב. ה linker מחבר תוכניות מחשב שעברוהידור לכדי תוכנית אחת שניתנתלהרצה ע"י מערכת הפעלה מסוימת. הקדמה
ניתן לייצר ספריות סטאטיות ומשותפות. ניתן להשתמש במשותפות בצורות: Dynamic linking Dynamic loading קימפול רגיל הואסטאטי פרט לספריותהסטנדארטיות. קימפול סטאטי מלא (-static) יכיל את כל המידע הדרוש בקובץ ה output. קימפול מסוג dynamic linking יכיל בקבוץ הריצה ref לקובץ ה .so המשותף ובזמן ריצה ייגש אליו. קימפול מסוג dynamic loading הוא דינאמי לחלוטין. הקדמה
תחילה ניצור קובצי C עם מס' פונקציות שנרצה לשתף: (ניצור גם את ה .h שלהם) יצירת ספרייה משותפת myMath2.c myMath.c double avg(double a, double b) { return (a+b)/2; } double max(double a, double b) { if(a>b) return a; else return b; } double min(double a, double b) { if(a<b) return a; else return b; } double add(double a, double b) { return a+b; } double sub(double a, double b) { return a-b; } double mul(double a, double b) { return a*b; } double div(double a, double b) { return a/b; }
כעת ניצור מהם object files ע"י קמפול: קיבלנו את הקבצים: יצירת ספרייה משותפת gcc -c myMath.c -o myMath.o gcc -c myMath2.c -o myMath2.o eli@eli-desktop:~/test2$ ls -l total 24 -rw-r--r-- 1 eli eli 198 2009-03-29 16:21 myMath2.c -rw-r--r-- 1 eli eli 97 2009-03-29 16:21 myMath2.h -rw-r--r-- 1 eli eli 1012 2009-03-29 16:22 myMath2.o -rw-r--r-- 1 eli eli 197 2009-03-29 16:13 myMath.c -rw-r--r-- 1 eli eli 129 2009-03-29 16:14 myMath.h -rw-r--r-- 1 eli eli 878 2009-03-29 16:20 myMath.o -o לצורך ציון שם קובץ ה output, -c לצורך קימפול ללא שלב הלינק.
ספרייה סטאטית ניצור ע"י הפקודה: ar מלשון archive. שם הספרייה יתחיל ב "lib" ויסתיים ב ".a" רשימתהקבציםכעת: יצירת ספרייה משותפת ar rcs libmyMath.a myMath.o myMath2.o eli@eli-desktop:~/test2$ ls -l total 28 -rw-r--r-- 1 eli eli 2138 2009-03-29 16:23 libmyMath.a -rw-r--r-- 1 eli eli 198 2009-03-29 16:21 myMath2.c -rw-r--r-- 1 eli eli 97 2009-03-29 16:21 myMath2.h -rw-r--r-- 1 eli eli 1012 2009-03-29 16:22 myMath2.o -rw-r--r-- 1 eli eli 197 2009-03-29 16:13 myMath.c -rw-r--r-- 1 eli eli 129 2009-03-29 16:14 myMath.h -rw-r--r-- 1 eli eli 878 2009-03-29 16:20 myMath.o r להכניס את ה obj files לספרייה ולהחליף אם קיימים, c ליצור את הספרייה אם לא קיימת, s לתחזק את ה symbol table
כדי ליצור ספרייה משותפת (לשימוש דינאמי) נצטרך תחילה ליצור object files ללא תלות במקומם ע"י הפרמטר –fPICPosition Independent Code כעת ניתן לקמפל ע"י: נוצר הקובץ: יצירת ספרייה משותפת gcc -c -fPIC myMath.c -o myMath.o gcc -c -fPIC myMath2.c -o myMath2.o gcc -shared -Wl,-soname,libmyMath.so.1 -o libmyMath.so.1.0.1 myMath.o myMath2.o -rw-r--r-- 1 eli eli 2138 2009-03-29 16:23 libmyMath.a -rwxr-xr-x 1 eli eli 5886 2009-03-29 16:39 libmyMath.so.1.0.1
תחילה ניצור את התוכנית שמשתמשת בפונקציות המשותפות: כעת נקמפל בעזרת לינקסטאטי ע"י: ובעזרת לינק דינאמי ע"י: שימוש בספרייה משותפת main.c #include <stdio.h> #include "myMath.h" #include "myMath2.h" int main(int argc, char* argv[]) { double v1, v2, m; v1 = 5.2; v2 = 7.9; m = avg(v1, v2); printf("The avg of %3.2f and %3.2f is %3.2f\n", v1, v2, m); m = max(v1, v2); printf("The max of %3.2f and %3.2f is %3.2f\n", v1, v2, m); m = min(v1, v2); printf("The min of %3.2f and %3.2f is %3.2f\n", v1, v2, m); return 0; } gcc -static main.c -L. -lmyMath -o statically_linked gcc main.c -o dynamically_linked -L. -lmyMath -L לצורך הגדרת התיקייה בה הלינקר יחפש את הספרייה, -l לצורך הגדרת שם הספרייה libname.so.
דוגמא ל dynamic loading: נקמפל ע"י: פלט עבור ההרצות שימוש בספרייה משותפת main2.c #include <stdio.h> #include <dlfcn.h> #include "myMath.h" #include "myMath2.h" int main(int argc, char* argv[]) { double v1, v2, m; v1 = 5.2; v2 = 7.9; void *dl_handle; double (*func)(double, double); dl_handle=dlopen("./libmyMath.so.1.0.1",RTLD_LAZY); func=dlsym(dl_handle,"avg"); m=(*func)(v1,v2); printf("The avg of %3.2f and %3.2f is %3.2f\n", v1, v2, m); func=dlsym(dl_handle,"max"); m=(*func)(v1,v2); printf("The max of %3.2f and %3.2f is %3.2f\n", v1, v2, m); func=dlsym(dl_handle,"min"); m=(*func)(v1,v2); printf("The min of %3.2f and %3.2f is %3.2f\n", v1, v2, m); dlclose(dl_handle); return 0;} gcc -rdynamic -o dynamically_loaded main2.c -ldl ./dynamically_linked ./statically_linked ./dynamically_loaded The avg of 5.20 and 7.90 is 6.55 The max of 5.20 and 7.90 is 7.90 The min of 5.20 and 7.90 is 5.20
נשווה את גודל הקבצים שהתקבלו: שימוש בספרייה משותפת -rwxr-xr-x 1 eli eli 6969 2009-03-29 16:43 dynamically_linked -rwxr-xr-x 1 eli eli 7642 2009-03-29 23:57 dynamically_loaded -rw-r--r-- 1 eli eli 2138 2009-03-29 16:23 libmyMath.a -rwxr-xr-x 1 eli eli 5886 2009-03-29 16:39 libmyMath.so.1.0.1 -rw-r--r-- 1 eli eli 645 2009-03-29 23:56 main2.c -rw-r--r-- 1 eli eli 404 2009-03-29 16:41 main.c -rw-r--r-- 1 eli eli 198 2009-03-29 16:21 myMath2.c -rw-r--r-- 1 eli eli 97 2009-03-29 16:21 myMath2.h -rw-r--r-- 1 eli eli 1272 2009-03-29 16:35 myMath2.o -rw-r--r-- 1 eli eli 197 2009-03-29 16:13 myMath.c -rw-r--r-- 1 eli eli 129 2009-03-29 16:14 myMath.h -rw-r--r-- 1 eli eli 878 2009-03-29 16:35 myMath.o -rwxr-xr-x 1 eli eli 557539 2009-03-29 16:42 statically_linked
בצעו מחדש את התהליכים שהוצגו בתרגול. באילו מהתוכניות אין צורך ב include ל “myMath.h” ו “myMath2.h” השוו את הגודל ל a.out רגיל. בצעו את אותה התוכנית ב c++. מצאו את ההתאמות הנדרשות ל windows. הטמעה