Scanning all the formats for binary translation of modules loading can

result in errors for a format loading but subsequent correct recognizing
for another format.

File format loading functions should avoid printing any additional
informations but just returning appropriate (and different between each
other) error condition, characterizing different informations.
Additively, the linker should handle appropriately different format
loading errors.

While a general mechanism is desired, fix a simple and common case on
amd64: file type is not recognized for link elf and confuses the linker.
Printout an error if all the registered linker classes can't recognize
and load the module.

Reviewed by:	jhb
Sponsored by:	Sandvine Incorporated
This commit is contained in:
Attilio Rao 2009-02-10 15:50:19 +00:00
parent fc94457307
commit a1d7ce03ea
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=188440
3 changed files with 11 additions and 6 deletions

View File

@ -425,6 +425,14 @@ linker_load_file(const char *filename, linker_file_t *result)
* the module was not found.
*/
if (foundfile) {
/*
* If the file type has not been recognized by the last try
* printout a message before to fail.
*/
if (error == ENOSYS)
printf("linker_load_file: Unsupported file type\n");
/*
* Format not recognized or otherwise unloadable.
* When loading a module that is statically built into

View File

@ -638,8 +638,7 @@ link_elf_load_file(linker_class_t cls, const char* filename,
goto out;
}
if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) {
link_elf_error(filename, "Unsupported file type");
error = ENOEXEC;
error = ENOSYS;
goto out;
}
if (hdr->e_machine != ELF_TARG_MACH) {
@ -694,8 +693,7 @@ link_elf_load_file(linker_class_t cls, const char* filename,
break;
case PT_INTERP:
link_elf_error(filename, "Unsupported file type");
error = ENOEXEC;
error = ENOSYS;
goto out;
}

View File

@ -474,8 +474,7 @@ link_elf_load_file(linker_class_t cls, const char *filename,
goto out;
}
if (hdr->e_type != ET_REL) {
link_elf_error(filename, "Unsupported file type");
error = ENOEXEC;
error = ENOSYS;
goto out;
}
if (hdr->e_machine != ELF_TARG_MACH) {