From 54e66c6bc1d0e4e1297418982c5bf46f5aa06e91 Mon Sep 17 00:00:00 2001 From: bemandrei Date: Thu, 28 Mar 2024 08:37:47 +0200 Subject: [PATCH] add lab 3 Signed-off-by: bemandrei --- .../00-vars-obs/program_executabil | Bin 0 -> 16200 bytes .../01-one-diy/a-dynamic/Makefile | 18 ++++++++++ .../01-one-diy/b-static/Makefile | 18 ++++++++++ .../03-entry-fix/a-no-main1/hello.c | 19 ---------- .../04-var-func-fix/state.c | 2 +- .../04-var-func-fix/state.h | 2 +- .../operatii-memorie-gdb/1-iterate/iterate.c | 33 ++++++++++-------- .../operatii-memorie-gdb/1-iterate/pb1 | Bin 0 -> 16056 bytes .../2-delete-first/delete-first.c | 28 +++++++++++---- .../operatii-memorie-gdb/2-delete-first/pb2 | Bin 0 -> 16088 bytes 10 files changed, 78 insertions(+), 42 deletions(-) create mode 100755 laborator/content/etapele-compilarii/00-vars-obs/program_executabil create mode 100644 laborator/content/etapele-compilarii/01-one-diy/a-dynamic/Makefile create mode 100644 laborator/content/etapele-compilarii/01-one-diy/b-static/Makefile delete mode 100644 laborator/content/etapele-compilarii/03-entry-fix/a-no-main1/hello.c create mode 100755 laborator/content/operatii-memorie-gdb/1-iterate/pb1 create mode 100755 laborator/content/operatii-memorie-gdb/2-delete-first/pb2 diff --git a/laborator/content/etapele-compilarii/00-vars-obs/program_executabil b/laborator/content/etapele-compilarii/00-vars-obs/program_executabil new file mode 100755 index 0000000000000000000000000000000000000000..5ca9af5b5ea242d5b6dd7cc47d8fd615de4f1405 GIT binary patch literal 16200 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

UfL?fcLF%k1CD zb}|nalsu6?)&2fo2S+)P_~qXh{+*HM6PW1Yzy8mI_4-HHuZ-*`AU|J%r+ofVRtSn+ zHUHB-|K02$_;&thef|g8LGT&hfbqwB+2=3Md4lr%C;j*5kLI1!gj|0WVM|82e$48z zB6Y%7@bUUr+t(>R{`Pi@oJ@%LZ9Mch7{OIRiT50@EJp}tb_VtMQt zl|Du}V1yfd7g(BmOaEnD(sQNsT|4sOV4JDT_XU@B#dZ-YmHgB6!-mr2bMT4kpG+!F A;Q#;t literal 0 HcmV?d00001 diff --git a/laborator/content/etapele-compilarii/01-one-diy/a-dynamic/Makefile b/laborator/content/etapele-compilarii/01-one-diy/a-dynamic/Makefile new file mode 100644 index 00000000..2b196f0a --- /dev/null +++ b/laborator/content/etapele-compilarii/01-one-diy/a-dynamic/Makefile @@ -0,0 +1,18 @@ +CFLAGS = -fno-PIC -m32 -g +LDFLAGS = -no-pie -m32 + +.DEFAULT_GOAL: all + +.PHONY: all clean + +all: name + +name: name.o + $(CC) $(LDFLAGS) -o $@ $^ + #ld -dynamic-linker /lib/ld-linux.so.2 -m elf_i386 -o $@ /usr/lib32/crt1.o /usr/lib32/crti.o $^ -lc /usr/lib32/crtn.o + +name.o: name.c + +clean: + -rm -f name name.o + -rm -f *~ diff --git a/laborator/content/etapele-compilarii/01-one-diy/b-static/Makefile b/laborator/content/etapele-compilarii/01-one-diy/b-static/Makefile new file mode 100644 index 00000000..e1e86265 --- /dev/null +++ b/laborator/content/etapele-compilarii/01-one-diy/b-static/Makefile @@ -0,0 +1,18 @@ +CFLAGS = -fno-PIC -m32 -g +LDFLAGS = -static -no-pie -m32 + +.DEFAULT_GOAL: all + +.PHONY: all clean + +all: name + +name: name.o + $(CC) $(LDFLAGS) -o $@ $^ + #ld -static -m elf_i386 -L/usr/lib/gcc/x86_64-linux-gnu/7/32/ -o $@ /usr/lib32/crt1.o /usr/lib32/crti.o $^ --start-group -lc -lgcc -lgcc_eh --end-group /usr/lib32/crtn.o + +name.o: name.c + +clean: + -rm -f name name.o + -rm -f *~ diff --git a/laborator/content/etapele-compilarii/03-entry-fix/a-no-main1/hello.c b/laborator/content/etapele-compilarii/03-entry-fix/a-no-main1/hello.c deleted file mode 100644 index 6fa73fa5..00000000 --- a/laborator/content/etapele-compilarii/03-entry-fix/a-no-main1/hello.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -static void hi(void) -{ - puts("Hi!"); -} - -static void bye(void) -{ - puts("Bye!"); -} - -int my_main(void) -{ - hi(); - bye(); - - return 0; -} diff --git a/laborator/content/etapele-compilarii/04-var-func-fix/state.c b/laborator/content/etapele-compilarii/04-var-func-fix/state.c index 508c5bca..183b5fc2 100644 --- a/laborator/content/etapele-compilarii/04-var-func-fix/state.c +++ b/laborator/content/etapele-compilarii/04-var-func-fix/state.c @@ -1,6 +1,6 @@ const char *init_shopping[3]; -void shopping_list(void) +void init_shopping(void) { init_shopping[0] = "cheese"; init_shopping[1] = "wine"; diff --git a/laborator/content/etapele-compilarii/04-var-func-fix/state.h b/laborator/content/etapele-compilarii/04-var-func-fix/state.h index c0ce67d9..5f28368f 100644 --- a/laborator/content/etapele-compilarii/04-var-func-fix/state.h +++ b/laborator/content/etapele-compilarii/04-var-func-fix/state.h @@ -2,6 +2,6 @@ #define STATE_H_ 1 void init_shopping(void); -extern const char *shopping_list[3]; +const char *shopping_list[3]; #endif diff --git a/laborator/content/operatii-memorie-gdb/1-iterate/iterate.c b/laborator/content/operatii-memorie-gdb/1-iterate/iterate.c index 4181b280..8355fe0f 100644 --- a/laborator/content/operatii-memorie-gdb/1-iterate/iterate.c +++ b/laborator/content/operatii-memorie-gdb/1-iterate/iterate.c @@ -1,19 +1,24 @@ -// SPDX-License-Identifier: BSD-3-Clause - #include - -/* - * Afisati adresele elementelor din vectorul "v" impreuna cu valorile - * de la acestea. - * Parcurgeti adresele, pe rand, din octet in octet, - * din 2 in 2 octeti si apoi din 4 in 4. - */ - int main(void) { int v[] = {0xCAFEBABE, 0xDEADBEEF, 0x0B00B135, 0xBAADF00D, 0xDEADC0DE}; - - (void) v; - - return 0; + printf("Parcurgere octet cu octet:\n"); + unsigned char *char_ptr = (unsigned char *)v; + for (int i = 0; i < sizeof(v); i++) { + printf("%p -> 0x%x\n", char_ptr, *char_ptr); + char_ptr++; + } + printf("\nParcurgere doi octeți la un pas:\n"); + char_ptr = (unsigned char *)v; + for (int i = 0; i < sizeof(v); i += 2) { + printf("%p -> 0x%x%x\n", char_ptr, *char_ptr, *(char_ptr + 1)); + char_ptr += 2; + } + printf("\nParcurgere patru octeți la un pas:\n"); + char_ptr = (unsigned char *)v; + for (int i = 0; i < sizeof(v); i += 4) { + printf("%p -> 0x%x%x%x%x\n", char_ptr, *char_ptr, *(char_ptr + 1), *(char_ptr + 2), *(char_ptr + 3)); + char_ptr += 4; + } + return 0; } diff --git a/laborator/content/operatii-memorie-gdb/1-iterate/pb1 b/laborator/content/operatii-memorie-gdb/1-iterate/pb1 new file mode 100755 index 0000000000000000000000000000000000000000..1ce256c33fab1dcada6759b2bcb4e63f4f981aca GIT binary patch literal 16056 zcmeHOeQX>@6`woXiPL=8`J(wK$(AN1ZRCsX*io9+&G}=KHROxL5k-P-)^}(7==tur z+e_`LDlQIDjcX|&0V05E5TceKB^9U&6-q8@8>dk~juauIN|B2i$$>)M0F?u3j`wEX zTd$XMDk}a#+L7*l^WMDQd$Vt6_hxTrzN+up6$}IfmlE-)Kxw#AX~NVny^SgWVX<8- zhVS)aotOu5snn_VumWgRWjr_=%Sm4Xh`d!;DT4PXwP55PA|h|DlE)4~VH9*6$ScDJ zlD$|%{b1yFC!U66D4P6s@E96EVRZAbDh<1cywyX z;?BUQ`5?uc>pVP0`Ddi`iY3YKK zu;K}k&cu^;hd^UIiQB~PJ*`d6W^Jg>snv$+o%+@~VYasIHKVaitTUdqW0|(S&52Yp z)@HRQFluLaDoIgIWm?n_x*vpNDS>OV1Q2VgU~MN!{KRSl=C3~ao%Jk_V<({CSi+ohnQ-ad<8RWXSL07H zrd;~@>;!PyrRUh#oF_fna!ycx(WS@hfy@bKLdUS{0#UR@H60Nz|X*c zm4Uxitox_Y|8BW4SoVi4LKt7q+rh$^(f@k+Ytm1l{u`jaS=cxTP_bU1eHXUeyzzFS zP&grFoH*XRamA5w!g%w>d6t1aB-t%O@%cgr<@X&t!oxH0fYqyL?$18sUu zzUED1sNoVsDXd%$mVfUERjfY-A{@X_!$Y7khRSLY9-6jS!l8W-QirynFj29-5A9wf z1p5WjzCMWXz-?n-$~gbmoyPg;5+iWIxN_TG0S?|E2jzu{j*9hg9L&e#?`yzjk=uOO z=x_KjR*iw{_9A1j;in)>-nv~VOhzFY7s`GJa^OqAoyEWLBs8LeW$w>RSHPH8|cKOEB)}B%0PhL zE*`KlkzA$|UUzA!h#j-FNKRFDh>dBj>QSw_XJgM@LfqvtjHcq!=HmC`TEfzDNiA(< z-S(29^5N#CEjy#U-+{SN#S5%0c^KaX<2#?e_X-94?;#I(0&om)1W-&B3I_mg0OnDK zg6~?f1fDu50zH+1wTtGLpMd`

*X0Mu2-i8nn!pui!R772{NbJ`5<9RPI``>N6D! zpDgbaJJ;-ZaO(#7IuiL`gwH0hlSH(If_fW18tAK0K?P$y51)IXZ{NfJN%SR^$Ais_ z=arlYK$pnM2R{RT2K)^88SpdUXTZ;Zp8-Dueg^yu%w&Mq_wjl@UaLpT;>030rH2xD z<0Z?6GQj66EWEbxZY7Ey3e5U5)G_XNp6p;Tr7RqO9m#C>uYx*0 z$g5Prt4eviJ>(DG&`O!}4v%wEK0@ucNao`p_y05C_1|8H)pWkYga-({b{{44deGg? z%{#PBhud>WJEzsugz7@oRW&&&);v>N8>+5*fYf*Ph;GKG^|JJ{LiF9s9%itZpL5dwZs8pV7bR`EvyPsndR)J-EBs2K|8LMkEYDdM5^6Nm{B{G$(mNK zM?_NH=|s$qMMKraEpQEf+_W+otJjPr?M$!e$XMMmGn(t}?gffVGQrZGWg3SS^_Crj zE}7=8gN=K2Q{UHO!bE*pzN$RvE3?b$4Guo)tjNsCZ21t+01nG2;esdOx3_qtT=xj1ZpiAPD**wk8u!%3QV zS=lZTiuNWUghD%`T8_pt*?1~BOE94=6H8b~pjtX%i;(PQ2&$pZ6o^>K#v&qQ$9h1- z@def?c~(NPE*eo?QSio+@}Y*7VsIToS>17Prs$Aj5rQ$@4MWv)DSa#v=TC5H!f%8s z-hFI5f1+k-%XP&2;Dd7(=FhcX3vIFRJVi-D;C4JW-@9)M|Ic<8zQ3^!_nEl){Cmu( zu_2+C|9Q}V0COJhKhFypIX=$|z5Ta^3JTsr?Z*kD!6oUCY4`t+e zCz!~BKHTLiAmE&i`8#Kie@r1ALq#vdr^D#xMo*_Mg;Z2r8IU=JULjF;9jZ z-+TPuC4Ljx@jRH(aPcu`UjC0jhdE*Y&hH5Qp78SlxsiS4I^qxD~pIwd;a-uP;MIKv+&KI6|FrmA@3Uk5cT z4R!Wz@pC2bv-H}t%!u>Q3KyT}->0iU35D&HG$XVALukOU%gO+)hmlN9)d>{{{{$n?{NSC literal 0 HcmV?d00001 diff --git a/laborator/content/operatii-memorie-gdb/2-delete-first/delete-first.c b/laborator/content/operatii-memorie-gdb/2-delete-first/delete-first.c index 2741b2d4..93620b97 100644 --- a/laborator/content/operatii-memorie-gdb/2-delete-first/delete-first.c +++ b/laborator/content/operatii-memorie-gdb/2-delete-first/delete-first.c @@ -4,7 +4,26 @@ #include #include -char *delete_first(char *s, char *pattern); +char *delete_first(char *s, char *pattern){ + int i = 0, cnt = 0, ans = 0, gasit = 0; + char *rez= malloc(strlen(s)); + for(i = 0; i < strlen(s); i++){ + int ci = i; + cnt = 0; + while(gasit == 0 && ci < strlen(s) && s[ci] == pattern[cnt]){ + cnt++; + ci++; + if(cnt == strlen(pattern)){ + gasit = 1; + i = ci; + break; + } + } + rez[ans] = s[i]; + ans++; + } + return rez; +} int main(void) { @@ -14,12 +33,7 @@ int main(void) */ char *s = "Ana are mere"; char *pattern = "re"; - - (void) s; - (void) pattern; - - // Decomentați linia după ce ați implementat funcția delete_first. - // printf("%s\n", delete_first(s, pattern)); + printf("%s\n", delete_first(s, pattern)); return 0; } diff --git a/laborator/content/operatii-memorie-gdb/2-delete-first/pb2 b/laborator/content/operatii-memorie-gdb/2-delete-first/pb2 new file mode 100755 index 0000000000000000000000000000000000000000..dc3aa7332d52dc738e6570ee70526b7ee14ac3d3 GIT binary patch literal 16088 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 S$GS@V+x&yaVjsaLs(%AKy1b46 literal 0 HcmV?d00001