diff options
-rw-r--r-- | binutils-2.24.51.midipix.patch | 268 |
1 files changed, 265 insertions, 3 deletions
diff --git a/binutils-2.24.51.midipix.patch b/binutils-2.24.51.midipix.patch index 04117f6..bde9234 100644 --- a/binutils-2.24.51.midipix.patch +++ b/binutils-2.24.51.midipix.patch @@ -1,13 +1,252 @@ diff -ru --new-file a/ld/pe-mdso.c b/ld/pe-mdso.c --- a/ld/pe-mdso.c 2019-08-14 06:12:57.193333307 -0400 -+++ a/ld/pe-mdso.c 2019-08-16 07:18:41.776390674 -0400 -@@ -0,0 +1,2 @@ ++++ a/ld/pe-mdso.c 2019-08-17 00:59:46.886167655 -0400 +@@ -0,0 +1,241 @@ ++#include "sysdep.h" ++#include "pe-mdso.h" ++ ++#include <stdint.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <errno.h> ++#include <sys/stat.h> ++ +#include <perk/perk.h> +#include <mdso/mdso.h> ++ ++extern char * program_name; ++extern int xatexit(void (*)(void)); ++ ++static char pe_mdso_tmp_lib_name[] = "/tmp/mdso_XXXXXXXXXXXX"; ++static char pe_perk_tmp_def_name[] = "/tmp/perk_XXXXXXXXXXXX"; ++static struct pe_driver_ctx * pe_dctx; ++ ++struct pe_mdso_lib { ++ dev_t st_dev; ++ ino_t st_ino; ++ char ar_name[24]; ++}; ++ ++struct pe_mdso_lib * pe_mdso_lib_arr; ++struct pe_mdso_lib * pe_mdso_lib_ptr; ++struct pe_mdso_lib * pe_mdso_lib_cap; ++ ++static int pe_mdso_perk_init(void) ++{ ++ char * argv[2]; ++ ++ if (pe_dctx) ++ return 0; ++ ++ argv[0] = program_name; ++ argv[1] = 0; ++ ++ return pe_get_driver_ctx(argv,0,0,0,&pe_dctx); ++} ++ ++static void pe_mdso_cache_unlink(void) ++{ ++ struct pe_mdso_lib * pe_mdso; ++ ++ for (pe_mdso=pe_mdso_lib_arr; pe_mdso<pe_mdso_lib_ptr; pe_mdso++) ++ unlink(pe_mdso->ar_name); ++} ++ ++static int pe_mdso_cache_alloc(void) ++{ ++ void * prev; ++ size_t size; ++ size_t nlib; ++ ++ if (pe_mdso_lib_cap > pe_mdso_lib_ptr) ++ return 0; ++ ++ prev = pe_mdso_lib_arr; ++ nlib = pe_mdso_lib_cap - pe_mdso_lib_arr; ++ size = nlib * sizeof(struct pe_mdso_lib); ++ ++ if (!(pe_mdso_lib_arr = calloc(nlib+2,sizeof(struct pe_mdso_lib)))) ++ return -1; ++ ++ if (!prev) ++ xatexit(pe_mdso_cache_unlink); ++ ++ memcpy(pe_mdso_lib_arr,prev,size); ++ ++ pe_mdso_lib_ptr = &pe_mdso_lib_arr[nlib]; ++ pe_mdso_lib_cap = &pe_mdso_lib_arr[nlib+2]; ++ ++ return 0; ++} ++ ++const char * pe_mdso_input_name(const char * input_name) ++{ ++ int fdin; ++ int fdout; ++ char * libname; ++ char * argv[8]; ++ ++ struct stat st; ++ struct pe_mdso_lib * pe_mdso; ++ struct pe_unit_ctx * pe_uctx; ++ struct pe_fd_ctx pe_fdctx; ++ struct mdso_driver_ctx * mdso_dctx; ++ ++ /* perk driver context */ ++ if (pe_mdso_perk_init() < 0) ++ return 0; ++ ++ /* defer when input_name cannot be opened */ ++ if ((fdin = open(input_name,O_RDONLY)) < 0) ++ return input_name; ++ ++ /* stat */ ++ if (fstat(fdin,&st) < 0) { ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ pe_output_error_vector(pe_dctx); ++ return 0; ++ } ++ ++ /* repeated input argument? */ ++ for (pe_mdso=pe_mdso_lib_arr; pe_mdso<pe_mdso_lib_ptr; pe_mdso++) { ++ if ((pe_mdso->st_dev == st.st_dev) && (pe_mdso->st_ino == st.st_ino)) { ++ close(fdin); ++ return pe_mdso->ar_name; ++ } ++ } ++ ++ /* defer when perk object/image context cannot be created */ ++ if (pe_get_unit_ctx(pe_dctx,input_name,&pe_uctx) < 0) { ++ close(fdin); ++ return input_name; ++ } ++ ++ /* defer when input file is not an image */ ++ switch (pe_uctx->meta->m_subtype) { ++ case PE_SUBTYPE_DLL: ++ case PE_SUBTYPE_EXE: ++ break; ++ ++ default: ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ return input_name; ++ } ++ ++ /* image bits */ ++ switch (pe_uctx->meta->m_abi) { ++ case PE_ABI_PE32: ++ argv[1] = "-m32"; ++ break; ++ ++ case PE_ABI_PE64: ++ argv[1] = "-m64"; ++ break; ++ ++ default: ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ return 0; ++ } ++ ++ /* perk driver fd context (get) */ ++ if ((pe_get_driver_fdctx(pe_dctx,&pe_fdctx)) < 0) { ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ pe_output_error_vector(pe_dctx); ++ return 0; ++ } ++ ++ /* template init */ ++ memset (&pe_perk_tmp_def_name[10],'X',12); ++ memset (&pe_mdso_tmp_lib_name[10],'X',12); ++ ++ /* perk .def file (create) */ ++ if ((pe_fdctx.fdout = mkstemp(pe_perk_tmp_def_name)) < 0) { ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ pe_output_error_vector(pe_dctx); ++ return 0; ++ } ++ ++ /* perk driver fd context (set) */ ++ if ((pe_set_driver_fdctx(pe_dctx,&pe_fdctx)) < 0) { ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ pe_output_error_vector(pe_dctx); ++ return 0; ++ } ++ ++ /* perk .def file (populate) */ ++ if (pe_output_export_symbols(pe_dctx,pe_uctx->meta) < 0) { ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ pe_output_error_vector(pe_dctx); ++ return 0; ++ }; ++ ++ /* done with perk */ ++ close(fdin); ++ pe_free_unit_ctx(pe_uctx); ++ ++ /* libname */ ++ if ((libname = strrchr(input_name,'/'))) ++ libname++; ++ else if ((libname = strrchr(input_name,'\\'))) ++ libname++; ++ else ++ libname = (char *)input_name; ++ ++ /* cache alloc (as needed) */ ++ if (pe_mdso_cache_alloc() < 0) ++ return 0; ++ ++ /* mdso lib file (create) */ ++ if ((fdout = mkstemp(pe_mdso_tmp_lib_name)) < 0) ++ return 0; ++ ++ /* mdso driver context (argv[1] already set, see above) */ ++ argv[0] = program_name; ++ argv[2] = "--libname"; ++ argv[3] = libname; ++ argv[4] = "--implib"; ++ argv[5] = pe_mdso_tmp_lib_name; ++ argv[6] = pe_perk_tmp_def_name; ++ argv[7] = 0; ++ ++ if (mdso_get_driver_ctx(argv,0,0,0,&mdso_dctx) < 0) { ++ close(fdout); ++ return 0; ++ } ++ ++ /* mdso lib file (generate) */ ++ if (mdso_create_implib_archive(mdso_dctx) < 0) { ++ close(fdout); ++ mdso_output_error_vector(mdso_dctx); ++ mdso_free_driver_ctx(mdso_dctx); ++ return 0; ++ } ++ ++ /* cache */ ++ strcpy(pe_mdso_lib_ptr->ar_name,pe_mdso_tmp_lib_name); ++ ++ pe_mdso_lib_ptr->st_dev = st.st_dev; ++ pe_mdso_lib_ptr->st_ino = st.st_ino; ++ pe_mdso_lib_ptr++; ++ ++ /* all done */ ++ unlink(pe_perk_tmp_def_name); ++ mdso_free_driver_ctx(mdso_dctx); ++ close(fdout); ++ ++ return pe_mdso_tmp_lib_name; ++} diff -ru --new-file a/bfd/pe-mdso.h b/bfd/pe-mdso.h --- a/bfd/pe-mdso.h 1969-12-31 19:00:00.000000000 -0500 +++ b/bfd/pe-mdso.h 2019-08-15 07:00:00.000000000 -0400 -@@ -0,0 +1,8 @@ +@@ -0,0 +1,10 @@ +#ifndef PEMDSO_H +#define PEMDSO_H + @@ -15,7 +254,30 @@ diff -ru --new-file a/bfd/pe-mdso.h b/bfd/pe-mdso.h +#define PE_DSOLIB_SUFFIX ".dso.a" +#define PE_IMPLIB_SUFFIX ".lib.a" + ++const char * pe_mdso_input_name(const char * input_name); ++ +#endif +diff -ru --new-file a/ld/ldlang.c b/ld/ldlang.c +--- a/ld/ldlang.c 2014-07-03 01:37:48.000000000 -0400 ++++ b/ld/ldlang.c 2019-08-16 12:31:17.048504021 -0400 +@@ -1117,6 +1117,16 @@ + lang_input_file_enum_type file_type, + const char *target) + { ++#ifdef PE_TARGET_MDSO ++ if (file_type == lang_input_file_is_marker_enum) { ++ (void)0; ++ } else if (file_type == lang_input_file_is_l_enum) { ++ (void)0; ++ } else if (!(name = pe_mdso_input_name(name))) { ++ fprintf(stderr,"%s: pe_mdso_input_name() returned an error.\n",program_name); ++ xexit(EXIT_FAILURE); ++ } ++#endif + return new_afile (name, file_type, target, TRUE); + } + +diff -ru --new-file a/ld/configure b/ld/configure --- a/ld/configure 2014-07-03 01:37:48.000000000 -0400 +++ b/ld/configure 2015-03-11 20:01:08.888756786 -0400 @@ -19773,3 +19773,31 @@ |