@Override
	protected void populateDynamicStructure(MemBuffer buf, Structure struct) {

		DataType entryDataType = entrySize == 8 ? QWordDataType.dataType : DWordDataType.dataType;

		int bufOffset = 0;
		int remaining = length; // limit to number of bytes specified for RELR table
		int index = 0; // relr base index

		struct.add(entryDataType, "r_relr_base_" + (++index), null);
		bufOffset += entrySize;
		remaining -= entrySize;

		int bitMaskCount = 0;

		try {
			while (remaining > 0) {
				long nextValue = readNextRelrEntry(buf, bufOffset);
				if ((nextValue & 1) == 1) {
					++bitMaskCount;
				}
				else {
					if (bitMaskCount != 0) {
						DataType maskArray = new ArrayDataType(entryDataType, bitMaskCount, entrySize);
						struct.add(maskArray, "r_relr_bits_" + index, null);
						bitMaskCount = 0;
					}
					struct.add(entryDataType, "r_relr_base_" + (++index), null);
				}
				bufOffset += entrySize;
				remaining -= entrySize;
			}

			if (bitMaskCount != 0) {
				DataType maskArray = new ArrayDataType(entryDataType, bitMaskCount, entrySize);
				struct.add(maskArray, "r_relr_bits_" + index, null);
			}
		}
		catch (MemoryAccessException | IllegalArgumentException e) {
			// ignore
		}
	}
Constructor
@param structName structure name for resulting structure
@param length total length of RELR table in bytes
@param entrySize RELR entry size.  This size also generally corresponds to the 
size if a stored pointer.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfRelrRelocationTableDataType.java