private void processEntryPoints(TaskMonitor monitor) throws CancelledException {
		monitor.checkCancelled();
		monitor.setMessage("Creating entry points...");

		long entry = elf.e_entry(); // already adjusted for pre-link
		if (entry != 0 && (elf.isExecutable() || elf.isSharedObject())) {
			Address entryAddr = createEntryFunction(ElfLoader.ELF_ENTRY_FUNCTION_NAME, entry);
			if (entryAddr != null) {
				addElfHeaderReferenceMarkup(elf.getEntryComponentOrdinal(), entryAddr);
				Function entryFunc = program.getFunctionManager().getFunctionAt(entryAddr);
				//note: ElfConstants.ELFOSABI_NONE is used when the are no os/abi-specific 
				//elf extensions, i.e., plain vanilla elf.  
				//note: this value can also represent "unspecified"
				if (entryFunc != null && (elf.e_ident_osabi() == ElfConstants.ELFOSABI_LINUX ||
					elf.e_ident_osabi() == ElfConstants.ELFOSABI_NONE)) {
					try {
						entryFunc.setCallingConvention(PROCESS_ENTRY_CALLING_CONVENTION_NAME);
					}
					catch (InvalidInputException e) {
						//calling convention for process entry not defined in the appropriate cspec
						//just skip
					}
				}
			}
		}

		// process dynamic entry points
		createDynamicEntryPoints(ElfDynamicType.DT_INIT, null, "_INIT_", monitor);
		createDynamicEntryPoints(ElfDynamicType.DT_FINI, null, "_FINI_", monitor);

		createDynamicEntryPoints(ElfDynamicType.DT_INIT_ARRAY, ElfDynamicType.DT_INIT_ARRAYSZ,
			"_INIT_", monitor);
		createDynamicEntryPoints(ElfDynamicType.DT_PREINIT_ARRAY, ElfDynamicType.DT_PREINIT_ARRAYSZ,
			"_PREINIT_", monitor);
		createDynamicEntryPoints(ElfDynamicType.DT_FINI_ARRAY, ElfDynamicType.DT_FINI_ARRAYSZ,
			"_FINI_", monitor);

	}
Transition memory range to read-only
@param range constrained read-only region or null for entire load segment
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java