Системски софтвер/Јул 1 2025

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Испит у року јул 1 2025. године одржан је 22. августа. Трајао је сат и по времена и радио се на рачунарима. Рок јул 1 представљао је "фебруарски" рок за школску 2024/2025. годину.

1. задатак

Поставка

Посматрају се два објектна програма levi.o и desni.o добијена помоћу GNU асемблера. Приказати излаз линкера izlaz.o, где је потребно приказати садржај:

  1. табеле симбола
  2. табеле секција
  3. релокационих записа строго поштујући школски формат и обавезно у складу са задатом нумерацијом симбола.

Напомене:

  • Линкер је покренут коришћењем следеће команде:
    ld -o izlaz.o -T script.ld levi.o desni.o
    где линкерска скрипта script.ld има следећи садржај:
    SECTIONS
    {
        .text : { *(.text) }
        .data : { *(.data) }
        .bss : { *(.bss) }
    }
  • Све нумеричке вредности уносити у хексадецималном формату на ширини од 4B без префикса 0x у другом комплементу двојке.
  • Нетачан одговор на ставке приказане падајућим менијем са понуђеним одговорима се пенализује са -33% поена од те ставке. Да се одређена ставка са понуђеним одговорима не би бодовала, потребно је одабрати одговор ???.

levi.o

#shdr
Num Address Size Type Flags Name
0: 00000000 004F PROGBITS AX .text
1: 00000000 0004 PROGBITS WA .data
2: 00000000 0022 NOBITS WA .bss
#symtab
Num Value Size Type Bind Ndx Name
0: 00000000 0 NOTYP LOC UND
1: 00000000 0 SCTN LOC 1 .text
2: 00000000 0 SCTN LOC 2 .data
3: 00000000 0 SCTN LOC 3 .bss
4: 00000013 c FUNC GLOB 1 a
5: 00000015 8 NOTYP GLOB 2 b
6: 00000000 0 NOTYP GLOB UND c
#.rela.text
Offset Type Symbol Addend
0000000d R_X86_64_32S 4 (a) 8
00000000 R_X86_64_PC32 6 (c) -4

desni.o

#shdr
Num Address Size Type Flags Name
1: 00000000 0012 PROGBITS AX .text
2: 00000000 0008 PROGBITS WA .data
3: 00000000 0010 NOBITS WA .bss
#symtab
Num Value Size Type Bind Ndx Name
0: 00000000 0 NOTYP LOC UND
1: 00000000 0 SCTN LOC 1 .text
2: 00000000 0 SCTN LOC 2 .data
3: 00000000 0 SCTN LOC 3 .bss
4: 00000004 8 NOTYP LOC 2 b
5: 00000000 0 OBJECT GLOB 5 c
6: 00000000 0 NOTYP GLOB UND a
#.rela.text
Offset Type Symbol Addend
00000003 R_X86_64_PC32 6 (a) -4
#.rela.data
Offset Type Symbol Addend
00000002 R_X86_64_32 3 (.bss) 8

Решење

#shdr
Num Address Size Type Flags Name
1: 00000000 00000061 PROGBITS AX .text
3: 00000061 0000000C PROGBITS WA .data
5: 0000006D 00000032 NOBITS WA .bss
#symtab
Num Value Size Type Bind Ndx Name
0: 00000000 0 NOTYP LOC UND
1: 00000000 0 SCTN LOC 1 .text
2: 00000061 0 SCTN LOC 3 .data
3: 0000006D 0 SCTN LOC 5 .bss
4: 00000069 0 NOTYP LOC 3 b
5: 00000082 0 NOTYP GLOB 5 b
6: 00000097 0 NOTYP GLOB 5 c
7: 00000013 0 FUNC GLOB 1 a
#.rela.text
Offset Type Symbol Addend
00000004 R_X86_64_32S a 00000000
0000000B R_X86_64_PC32 c FFFFFFFC
00000052 R_X86_64_PC32 a FFFFFFFC
#.rela.data
Offset Type Symbol Addend
00000006 R_X86_64_32 .bss 00000022

2. задатак

Поставка

Посматра се JIT емулатор и емулирање следећег програма.

  1. Означити све блокове који ће у току рада емулатора бити преведени. За сваки преведени блок навести јединствену идентификацију у облику B<n>(<x>-<y>) (<n> је редни број блока у погледу тренутка његовог превођења при чему нумерација почиње од броја један, <x> је редни број прве а <y> редни број последње линије изворног кода блока).
  2. Навести секвенцу извршавања. У секвенци извршавања могу се нађи само GP (сваки пут када се емулатор врати у главну петљу), BH (сваки пут када се позове функција која помаже у разрешавању скокова) и B<n> (сваки пут када се изврши дати блок у складу са ознакама из претходне тачке).
      BEG       ; 0x00
      LDA A     ; 0x00
  L3  BPO L1    ; 0x02
      BZE L2    ; 0x04
      LDA B     ; 0x06
      DEC       ; 0x08
      STA B     ; 0x09
      BNZ L2    ; 0x0B
      HLT       ; 0x0D
  L2  LDA A     ; 0x0E
      INC       ; 0x10
      STA A     ; 0x11
  L1  SBI 2     ; 0x13
      BRN L3    ; 0x15
  A   DC 1      ; 0x17
  B   DC 2      ; 0x18
      END

Решење

  1. Блокови по редоследу превођења:
    1. B1(0x00 - 0x03)
    2. B2(0x13 - 0x16)
    3. B3(0x02 - 0x03)
    4. B4(0x04 - 0x05)
    5. B5(0x06 - 0x0C)
    6. B6(0x0E - 0x12)
    7. B7(0x0D - 0x0D)
  2. Редослед извршавања:
    1. GP
    2. B1
    3. BH
    4. GP
    5. B2
    6. BH
    7. GP
    8. B3
    9. BH
    10. GP
    11. B4
    12. BH
    13. GP
    14. B5
    15. BH
    16. GP
    17. B6
    18. B2
    19. BH
    20. B3
    21. BH
    22. B4
    23. BH
    24. B6
    25. B2
    26. B3
    27. B2
    28. B3
    29. B4
    30. BH
    31. B5
    32. BH
    33. GP
    34. B7
    35. BH
    36. GP

3. задатак

Поставка

Одредити индекс класификације и то да ли је израз релокативан за сваки израз дат у табели, уколико се смешта на место placeholder.

.extern e1, e2
.equ sym, 100
.section .X
x1: .skip 4
x2: .skip 5
.section .Y
y1: .skip 6
y2: .skip 7
y3: .skip 8
.section .here
# placeholder
.end

Решење

.X .Y .here .unique(e1) .unique(e2) Израз релокативан?
.long x1+y1-y2+sym 1 0 0 0 0 Да
.long x1+x2 2 0 0 0 0 Не
.long sym+3 0 0 0 0 0 Не
.long e1+e2 0 0 0 1 1 Не
.long .+e1-e2 0 0 1 1 -1 Не

.long sym+3 је апсолутан, самим тим није релокативан.

4. задатак

Поставка

Навести шта је резултат експанзије следећег кода од стране C претпроцесора.

#define A 1, 1
#define B(b), #b
#define C(c1, c2) c1 ## c2
#define D(d) d
#define E(e) B(A) C(e) D(#e)
E(A)

Решење

"A" 11 "A"