private void markupGotBLRL(ElfLoadHelper elfLoadHelper, TaskMonitor monitor)
			throws CancelledException {

		Program program = elfLoadHelper.getProgram();
		Memory memory = program.getMemory();
		Listing listing = program.getListing();

		boolean applyCallFixup = gotThunkCallFixupExists(program);

		Disassembler disassembler = Disassembler.getDisassembler(program, monitor, null);

		MemoryBlock[] blocks = memory.getBlocks();

		for (MemoryBlock block : blocks) {
			monitor.checkCancelled();

			MemoryBlock gotBlock = block;

			if (!gotBlock.getName().startsWith(ElfSectionHeaderConstants.dot_got) ||
				!gotBlock.isExecute()) {
				continue;
			}

			Address blrlAddr = findBLRL(gotBlock, memory.isBigEndian());
			if (blrlAddr == null) {
				continue;
			}

			listing.clearCodeUnits(blrlAddr, gotBlock.getEnd(), false);

			Address blrlEndAddr = blrlAddr.add(3);
			AddressSet range = new AddressSet(blrlAddr, blrlEndAddr);

			disassembler.disassemble(blrlAddr, range);

			try {
				Instruction blrlInstr = listing.getInstructionAt(blrlAddr);
				if (blrlInstr == null) {
					elfLoadHelper.log(
						"Failed to generate blrl instruction within " + gotBlock.getName());
					continue;
				}

				blrlInstr.setFlowOverride(FlowOverride.RETURN);

				Function f = listing.createFunction(GOT_THUNK_NAME + gotBlock.getName(), blrlAddr,
					range, SourceType.IMPORTED);
				if (applyCallFixup) {
					f.setCallFixup(GOT_THUNK_NAME);
				}

			}
			catch (InvalidInputException | OverlappingFunctionException e) {
				// should not happen
			}

		}
	}
Identify presence of blrl instruction within .got section with execute permission.
The instruction will be disassembled and transformed into a get_pc_thunk_lr function
with an applied call-fixup.
@param elfLoadHelper
@param monitor
@throws CancelledException
Ghidra/Processors/PowerPC/src/main/java/ghidra/app/util/bin/format/elf/extend/PowerPC_ElfExtension.java