2015-10-15 17 views
11

Patrząc na bugfix w kodzie źródłowym LLVM, natknąłem się na termin "wirtualna sekcja" i zastanawiałem się, co to znaczy.Co to jest wirtualna sekcja LLVM w kontekście plików obiektowych?

Próbowałem googlować kilka różnych terminów i dalej przeglądać kod źródłowy, ale wszystko, co udało mi się znaleźć, to to, że implementacje dla każdej funkcji pliku isSectionVirtual formatu pliku obiektu wydają się wyrażać, że sekcja jest wirtualna, jeśli nie zawiera żadnej zawartości (takie jak sekcja .bss, ale kod źródłowy wyraźnie wyraża, że ​​są to dwie różne koncepcje). Implementacja różni się w zależności od konkretnego formatu obiektu.

Jestem całkiem nowy w zrozumieniu wnętrzności plików obiektowych, więc nie jestem pewien, czy jest to obiekt LLVM, czy bardziej ogólna koncepcja obecna poza LLVM.

Czy ktoś mógłby mi powiedzieć, jaka sekcja wirtualna znajduje się w pliku obiektowym?

Odpowiedz

1

Zgodnie z komentarzami w kodzie źródłowym LLVM, "sekcja wirtualna" jest sekcją, która nie zawiera żadnych danych w pliku obiektowym. (Specyfikacja PE/COFF nie ma takiego terminu, więc prawdopodobnie jest używana tylko w LLVM).

Sekcja .bss zawiera tylko niezainicjalizowane dane, więc nie powinna zawierać żadnych danych w pliku obiektowym (choć teoretycznie może). Więc sekcja .bss powinno być „wirtualna”, i nie ma potrzeby, aby mieć następujący kod w LLVM:

if (Sec.isBSS() || Sec.isVirtual()) 

Ale chodzi o to, że LLVM nie obsługuje „wirtualnych” sekcje plików Mach-O (czy może pliki Mach-o nie może mieć)

bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const { 
    // FIXME: Unimplemented. 
    return false; 
} 

Stąd LLVM ma oddzielne kontroli dla isBSS i isVirtual.

sekcja

BSS jest:

  • czytelne
  • jednokrotnego zapisu
  • niewykonywalne
  • danych zainicjalizowana

Sekcja wirtualne mogą mieć różne właściwości, a przypadków użycia, takie jak zapisywalne + wykonywalne lub nieczytelne (wyrównanie) sekcje, które nie są BSS (zauważ, że sekcje do zapisu + wykonywalne są niezabezpieczone, a sekcje "wyrównania" są użyteczne tylko w przypadku niektórych sztuczek chroniących kod (zapobieganie zrzucaniu).

Tak więc każda sekcja BSS jest sekcją wirtualną, ale nie każda sekcja wirtualna jest sekcją BSS.

+0

Z pewnością oddzielne kontrole wskazują, że są to w rzeczywistości różne koncepcje? W przeciwnym razie pojawi się 'isBSS' i' isVirtual' nie musi istnieć. Dziękuję za twoje wejście, niezależnie! – OMGtechy

+0

@OMGtechy Zaktualizowałem odpowiedź. – Abyx

+0

Dzięki, to znacznie lepiej! – OMGtechy