@Override
	protected MemoryBlock createInitializedBlock(MemoryLoadable loadable, boolean isOverlay,
			String name, Address start, long fileOffset, long dataLength, String comment, boolean r,
			boolean w, boolean x, TaskMonitor monitor)
			throws IOException, AddressOverflowException, CancelledException {

		long revisedLength = checkBlockLimit(name, dataLength, true);

		if (isDiscardableFillerSegment(loadable, name, start, fileOffset, dataLength)) {
			Msg.debug(this,
				"Discarding " + dataLength + "-byte alignment/filler " + name + " at " + start);
			return null;
		}

		// TODO: MemoryBlockUtil poorly and inconsistently handles duplicate name errors (can throw RuntimeException).
		// Are we immune from such errors? If not, how should they be handled?

		if (start.isNonLoadedMemoryAddress()) {
			r = false;
			w = false;
			x = false;
		}

//		Msg.debug(this,
//			"Loading block " + name + " at " + start + " from file offset " + fileOffset);

		long compSectOrigSize =
			loadable instanceof ElfSectionHeader header && header.isCompressed() ? header.getSize()
					: -1;

		String blockComment = comment;
		if (compSectOrigSize >= 0) {
			blockComment += " (decompressed, original length: 0x%x)".formatted(compSectOrigSize);
		}
		else if ((fileOffset + revisedLength - 1) >= fileBytes.getSize()) {
			// ensure valid length for non-compressed items
			revisedLength = fileBytes.getSize() - fileOffset;
			log("Truncating block load for " + name + " which exceeds file length");
		}
		if (dataLength != revisedLength) {
			// either gt MAX_BINARY_SIZE or gt fileBytes size
			blockComment += " (section truncated)";
		}

		MemoryBlock block = null;
		try {
			if (loadable != null && loadable.hasFilteredLoadInputStream(this, start)) {
				// block is unable to map directly to file bytes - load from input stream
				try (InputStream is = loadable.getFilteredLoadInputStream(this, start,
					revisedLength, (errorMsg, th) -> {
						String loadableTypeStr = compSectOrigSize >= 0 ? "compressed section " : "";
						log.appendMsg("Error when reading %s[%s]: %s".formatted(loadableTypeStr,
							name, errorMsg));
						Msg.error(this, errorMsg, th);
					})) {
					block = MemoryBlockUtils.createInitializedBlock(program, isOverlay, name, start,
						is, revisedLength, blockComment, BLOCK_SOURCE_NAME, r, w, x, log, monitor);
				}
			}
			else {
				// create block using direct mapping to file bytes
				block = MemoryBlockUtils.createInitializedBlock(program, isOverlay, name, start,
					fileBytes, fileOffset, revisedLength, blockComment, BLOCK_SOURCE_NAME, r, w, x,
					log);
			}
		}
		finally {
			if (block == null) {
				Address end = start.addNoWrap(revisedLength - 1);
				log("Unexpected ELF memory block load conflict when creating '" + name + "' at " +
					start.toString(true) + "-" + end.toString(true));
			}
		}
		return block;
	}
check if new symbol needs to grab the primary label.
Elf sometimes has multiple symbols at a location marking the type of instruction of data at the location.
@param sym - new symbol to be made primary (some exclusions apply)
@return revised symbol
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java