void processSections(OptionalHeader optHeader, boolean symbolsProcessed) throws IOException {
		long oldIndex = reader.getPointerIndex();

		int tmpIndex = getPointerToSections();
		if (numberOfSections < 0) {
			Msg.error(this, "Number of sections = " + numberOfSections);
		}
		else if (optHeader.getFileAlignment() == 0) {
			Msg.error(this, "File alignment == 0: section processing skipped");
		}
		else {
			long stringTableOffset = symbolsProcessed ? getStringTableOffset() : -1;
			sectionHeaders = new SectionHeader[numberOfSections];
			for (int i = 0; i < numberOfSections; ++i) {
				SectionHeader section =
					SectionHeader.readSectionHeader(reader, tmpIndex, stringTableOffset);
				sectionHeaders[i] = section;

				int pointerToRawData = section.getPointerToRawData();
				int sizeOfRawData = section.getSizeOfRawData();

				// Ensure PointerToRawData + SizeOfRawData doesn't exceed the length of the file
				if (pointerToRawData >= reader.length()) {
					sizeOfRawData = 0;
					Msg.warn(this, "Section " + section.getName() + " begins after end of file!");
				}
				else if (pointerToRawData + sizeOfRawData > reader.length()) {
					sizeOfRawData = (int) (reader.length() - pointerToRawData);
					Msg.warn(this,
						String.format("Section %s exceeds file length...truncating from %d to %d",
							section.getName(), section.getSizeOfRawData(), sizeOfRawData));
				}
				section.setSizeOfRawData(sizeOfRawData);

				// Ensure VirtualSize is large enough to accommodate SizeOfRawData, but do not
				// exceed the next alignment boundary.  We can only do this if the VirtualAddress is
				// already properly aligned, since we currently don't support moving sections to
				// different addresses to enforce alignment.
				int virtualAddress = section.getVirtualAddress();
				int virtualSize = section.getVirtualSize();
				int alignedVirtualAddress = PortableExecutable.computeAlignment(virtualAddress,
					optHeader.getSectionAlignment());
				int alignedVirtualSize = PortableExecutable.computeAlignment(virtualSize,
					optHeader.getSectionAlignment());
				if (virtualAddress == alignedVirtualAddress) {
					if (sizeOfRawData > virtualSize) {
						section.setVirtualSize(Math.min(sizeOfRawData, alignedVirtualSize));
					}
				}
				else {
					Msg.warn(this, "Section " + section.getName() + " is not aligned!");
				}
				tmpIndex += SectionHeader.IMAGE_SIZEOF_SECTION_HEADER;
			}
		}

		reader.setPointerIndex(oldIndex);
	}
Returns the file pointer to the section headers.
@return the file pointer to the section headers
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java