@@ -725,7 +725,7 @@ let needed imported defined resolve_alias resolve_alternate obj =
725725    StrSet. empty
726726    obj.symbols
727727
728- let  build_dll  link_exe  output_file  files  exts  extra_args  = 
728+ let  build_dll  link_exe  output_file  files  exts  extra_args_string  = 
729729  let  main_pgm =  link_exe <>  `DLL  in 
730730
731731  (*  fully resolve filenames, eliminate duplicates *) 
@@ -1007,6 +1007,53 @@ let build_dll link_exe output_file files exts extra_args =
10071007          link_obj (Printf. sprintf " %s(%s)"   libname objname) obj)
10081008  in 
10091009
1010+   let  entrypoint = 
1011+     if  not  main_pgm then 
1012+       None 
1013+     else 
1014+       match  ! toolchain with 
1015+       |  `CYGWIN64  ->
1016+           Some  " main" 
1017+       |  `MINGW  |  `MINGW64  -> begin 
1018+           let  entry_point  s  = 
1019+             String. length s >  7  &&  String. sub s 0  7  =  " -Wl,-e," 
1020+           in 
1021+           try 
1022+             let  s =  List. find entry_point ! extra_args in 
1023+             Some  (String. sub s 7  (String. length s -  7 ))
1024+           with  Not_found  -> 
1025+             Some  " mainCRTStartup" 
1026+         end 
1027+       |  `MSVC  |  `MSVC64  -> begin 
1028+           let  entry_point  s  = 
1029+             String. length s >  7  &&  String. lowercase_ascii (String. sub s 0  7 ) =  " /entry:" 
1030+           in 
1031+           try 
1032+             let  s =  List. find entry_point ! extra_args in 
1033+             Some  (String. sub s 7  (String. length s -  7 ))
1034+           with  Not_found  -> 
1035+             if  ! subsystem =  " windows"   then 
1036+               Some  " WinMainCRTStartup" 
1037+             else 
1038+               Some  " mainCRTStartup" 
1039+         end 
1040+       |  `LIGHTLD  |  `GNAT  |  `GNAT64  ->
1041+           None 
1042+   in 
1043+   let  ()  = 
1044+     match  entrypoint with 
1045+     |  None  -> () 
1046+     |  Some  entrypoint  ->
1047+         try 
1048+           let  (libname, objname, _)  as  o  =  defined_in entrypoint in 
1049+           if  ! explain then 
1050+             Printf. printf " %s(%s) because of entrypoint %s\n %!"   libname objname
1051+                                                                 entrypoint;
1052+           link_libobj o
1053+         with  Not_found  -> 
1054+           if  ! explain then 
1055+             Printf. printf " Entrypoint %s not found\n %!"   entrypoint
1056+   in 
10101057  let  redirect =  Hashtbl. create 16  in 
10111058  List. iter
10121059    (fun  (fn , obj ) ->
@@ -1142,24 +1189,24 @@ let build_dll link_exe output_file files exts extra_args =
11421189           being an empty file. *)  
11431190        let  c =  open_out implib in  output_string c " x"  ; close_out c;
11441191        let  _impexp =  add_temp (Filename. chop_suffix implib " .lib"   ^  " .exp"  ) in 
1145-         let  extra_args  = 
1146-           if  ! custom_crt then  " /nodefaultlib:LIBCMT /nodefaultlib:MSVCRT "   ^  extra_args 
1147-           else  " msvcrt.lib "   ^  extra_args 
1192+         let  extra_args_string  = 
1193+           if  ! custom_crt then  " /nodefaultlib:LIBCMT /nodefaultlib:MSVCRT "   ^  extra_args_string 
1194+           else  " msvcrt.lib "   ^  extra_args_string 
11481195        in 
11491196
1150-         let  extra_args  = 
1151-           if  ! machine =  `x64  then  (Printf. sprintf " /base:%s "   ! base_addr) ^  extra_args  else  extra_args 
1197+         let  extra_args_string  = 
1198+           if  ! machine =  `x64  then  (Printf. sprintf " /base:%s "   ! base_addr) ^  extra_args_string  else  extra_args_string 
11521199        in 
11531200
1154-         let  extra_args  = 
1201+         let  extra_args_string  = 
11551202          (*  FlexDLL doesn't process .voltbl sections correctly, so don't allow the linker
11561203             to process them. *)  
11571204          let  command = 
11581205            if  Sys. win32 then  link ^  "  /nologo /? | findstr EMITVOLATILEMETADATA > NUL" 
11591206            else  link ^  "  /nologo '/?' | grep -iq emitvolatilemetadata >/dev/null"   in 
11601207          if  Sys. command command =  0  then 
1161-             " /EMITVOLATILEMETADATA:NO "   ^  extra_args 
1162-           else  extra_args 
1208+             " /EMITVOLATILEMETADATA:NO "   ^  extra_args_string 
1209+           else  extra_args_string 
11631210        in 
11641211
11651212        (*  Flexdll requires that all images (main programs and all the DLLs) are
@@ -1187,7 +1234,7 @@ let build_dll link_exe output_file files exts extra_args =
11871234          (Filename. quote output_file)
11881235          ! subsystem
11891236          files descr
1190-           extra_args 
1237+           extra_args_string 
11911238    |  `CYGWIN64  ->
11921239        let  def_file = 
11931240          if  main_pgm then  " " 
@@ -1209,7 +1256,7 @@ let build_dll link_exe output_file files exts extra_args =
12091256          descr
12101257          files
12111258          def_file
1212-           extra_args 
1259+           extra_args_string 
12131260    |  `MINGW  |  `MINGW64  |  `GNAT  |  `GNAT64  ->
12141261        let  def_file = 
12151262          if  main_pgm then  " " 
@@ -1233,7 +1280,7 @@ let build_dll link_exe output_file files exts extra_args =
12331280          files
12341281          def_file
12351282          (if  ! implib then  " -Wl,--out-implib="   ^  Filename. quote (Filename. chop_extension output_file ^  " .a"  ) else  " "  )
1236-           extra_args 
1283+           extra_args_string 
12371284    |  `LIGHTLD  ->
12381285        no_merge_manifest :=  true ;
12391286        let  ld =  Option. value ! Cmdline. use_linker ~default: " ld"   in 
@@ -1246,7 +1293,7 @@ let build_dll link_exe output_file files exts extra_args =
12461293          descr
12471294          files
12481295          (if  ! implib then  " --out-implib "   ^  Filename. quote (Filename. chop_extension output_file ^  " .a"  ) else  " "  )
1249-           extra_args 
1296+           extra_args_string 
12501297  in 
12511298  debug ~dry_mode  1  " + %s"   cmd;
12521299  if  not  ! dry_mode then  begin 
0 commit comments