private List<ElfRelocation> parseAndroidRelocations(BinaryReader reader) throws IOException {

		String identifier = reader.readNextAsciiString(4);
		if (!"APS2".equals(identifier)) {
			throw new IOException("Unsupported Android relocation table format");
		}

		List<ElfRelocation> relocations = new ArrayList<>();

		try {
			int relocationIndex = 0;
			long remainingRelocations = reader.readNext(LEB128::signed); // reloc_count
			long offset = reader.readNext(LEB128::signed); // reloc_baseOffset
			long addend = 0;

			while (remainingRelocations > 0) {

				// start new group - read group header (size and flags)

				// group_size
				long groupSize = reader.readNext(LEB128::signed);
				if (groupSize > remainingRelocations) {
					elfHeader.logError("Group relocation count " + groupSize +
						" exceeded total count " + remainingRelocations);
					break;
				}

				// group_flags
				long groupFlags = reader.readNext(LEB128::signed);
				boolean groupedByInfo =
					(groupFlags & AndroidElfRelocationGroup.RELOCATION_GROUPED_BY_INFO_FLAG) != 0;
				boolean groupedByDelta = (groupFlags &
					AndroidElfRelocationGroup.RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG) != 0;
				boolean groupedByAddend =
					(groupFlags & AndroidElfRelocationGroup.RELOCATION_GROUPED_BY_ADDEND_FLAG) != 0;
				boolean groupHasAddend =
					(groupFlags & AndroidElfRelocationGroup.RELOCATION_GROUP_HAS_ADDEND_FLAG) != 0;

				// group_offsetDelta (optional)
				long groupOffsetDelta = groupedByDelta ? reader.readNext(LEB128::signed) : 0;

				// group_info (optional)
				long groupRInfo = groupedByInfo ? reader.readNext(LEB128::signed) : 0;

				if (groupHasAddend && groupedByAddend) {
					if (!addendTypeReloc) {
						elfHeader.logError(
							"ELF Android Relocation processing failed.  Unexpected r_addend in android.rel section");
						return List.of();
					}
					// group_addend (optional)
					addend += reader.readNext(LEB128::signed);
				}
				else if (!groupHasAddend) {
					addend = 0;
				}

				// Process all group entries
				for (int i = 0; i < groupSize; i++) {
					// reloc_offset (optional)
					offset += groupedByDelta ? groupOffsetDelta : reader.readNext(LEB128::signed);

					// reloc_info (optional)
					long info = groupedByInfo ? groupRInfo : reader.readNext(LEB128::signed);

					long rAddend = 0;
					if (addendTypeReloc && groupHasAddend) {
						if (!groupedByAddend) {
							// reloc_addend (optional)
							addend += reader.readNext(LEB128::signed);
						}
						rAddend = addend;
					}
					relocations.add(ElfRelocation.createElfRelocation(elfHeader, relocationIndex++,
						addendTypeReloc, offset, info, rAddend));
				}

				remainingRelocations -= groupSize;
			}
		}
		catch (IOException e) {
			Msg.error(this, "Error reading relocations.", e);
		}

		return relocations;
	}
Determine if required symbol table is missing.  If so, relocations may not be processed.
@return true if required symbol table is missing, else false
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfRelocationTable.java