@@ -126,7 +126,6 @@ pub fn get_linker<'a>(
126126    // FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction 
127127    // to the linker args construction. 
128128    assert ! ( cmd. get_args( ) . is_empty( )  || sess. target. vendor == "uwp" ) ; 
129- 
130129    match  flavor { 
131130        LinkerFlavor :: Lld ( LldFlavor :: Link )  | LinkerFlavor :: Msvc  => { 
132131            Box :: new ( MsvcLinker  {  cmd,  sess } )  as  Box < dyn  Linker > 
@@ -149,6 +148,8 @@ pub fn get_linker<'a>(
149148        LinkerFlavor :: PtxLinker  => Box :: new ( PtxLinker  {  cmd,  sess } )  as  Box < dyn  Linker > , 
150149
151150        LinkerFlavor :: BpfLinker  => Box :: new ( BpfLinker  {  cmd,  sess } )  as  Box < dyn  Linker > , 
151+ 
152+         LinkerFlavor :: L4Bender  => Box :: new ( L4Bender :: new ( cmd,  sess) )  as  Box < dyn  Linker > , 
152153    } 
153154} 
154155
@@ -1355,6 +1356,157 @@ impl<'a> Linker for WasmLd<'a> {
13551356    } 
13561357} 
13571358
1359+ /// Linker shepherd script for L4Re (Fiasco) 
1360+ pub  struct  L4Bender < ' a >  { 
1361+     cmd :  Command , 
1362+     sess :  & ' a  Session , 
1363+     hinted_static :  bool , 
1364+ } 
1365+ 
1366+ impl < ' a >  Linker  for  L4Bender < ' a >  { 
1367+     fn  link_dylib ( & mut  self ,  _lib :  Symbol ,  _verbatim :  bool ,  _as_needed :  bool )  { 
1368+         bug ! ( "dylibs are not supported on L4Re" ) ; 
1369+     } 
1370+     fn  link_staticlib ( & mut  self ,  lib :  Symbol ,  _verbatim :  bool )  { 
1371+         self . hint_static ( ) ; 
1372+         self . cmd . arg ( format ! ( "-PC{}" ,  lib) ) ; 
1373+     } 
1374+     fn  link_rlib ( & mut  self ,  lib :  & Path )  { 
1375+         self . hint_static ( ) ; 
1376+         self . cmd . arg ( lib) ; 
1377+     } 
1378+     fn  include_path ( & mut  self ,  path :  & Path )  { 
1379+         self . cmd . arg ( "-L" ) . arg ( path) ; 
1380+     } 
1381+     fn  framework_path ( & mut  self ,  _:  & Path )  { 
1382+         bug ! ( "frameworks are not supported on L4Re" ) ; 
1383+     } 
1384+     fn  output_filename ( & mut  self ,  path :  & Path )  { 
1385+         self . cmd . arg ( "-o" ) . arg ( path) ; 
1386+     } 
1387+ 
1388+     fn  add_object ( & mut  self ,  path :  & Path )  { 
1389+         self . cmd . arg ( path) ; 
1390+     } 
1391+ 
1392+     fn  full_relro ( & mut  self )  { 
1393+         self . cmd . arg ( "-zrelro" ) ; 
1394+         self . cmd . arg ( "-znow" ) ; 
1395+     } 
1396+ 
1397+     fn  partial_relro ( & mut  self )  { 
1398+         self . cmd . arg ( "-zrelro" ) ; 
1399+     } 
1400+ 
1401+     fn  no_relro ( & mut  self )  { 
1402+         self . cmd . arg ( "-znorelro" ) ; 
1403+     } 
1404+ 
1405+     fn  cmd ( & mut  self )  -> & mut  Command  { 
1406+         & mut  self . cmd 
1407+     } 
1408+ 
1409+     fn  set_output_kind ( & mut  self ,  _output_kind :  LinkOutputKind ,  _out_filename :  & Path )  { } 
1410+ 
1411+     fn  link_rust_dylib ( & mut  self ,  _:  Symbol ,  _:  & Path )  { 
1412+         panic ! ( "Rust dylibs not supported" ) ; 
1413+     } 
1414+ 
1415+     fn  link_framework ( & mut  self ,  _framework :  Symbol ,  _as_needed :  bool )  { 
1416+         bug ! ( "frameworks not supported on L4Re" ) ; 
1417+     } 
1418+ 
1419+     fn  link_whole_staticlib ( & mut  self ,  lib :  Symbol ,  _verbatim :  bool ,  _search_path :  & [ PathBuf ] )  { 
1420+         self . hint_static ( ) ; 
1421+         self . cmd . arg ( "--whole-archive" ) . arg ( format ! ( "-l{}" ,  lib) ) ; 
1422+         self . cmd . arg ( "--no-whole-archive" ) ; 
1423+     } 
1424+ 
1425+     fn  link_whole_rlib ( & mut  self ,  lib :  & Path )  { 
1426+         self . hint_static ( ) ; 
1427+         self . cmd . arg ( "--whole-archive" ) . arg ( lib) . arg ( "--no-whole-archive" ) ; 
1428+     } 
1429+ 
1430+     fn  gc_sections ( & mut  self ,  keep_metadata :  bool )  { 
1431+         if  !keep_metadata { 
1432+             self . cmd . arg ( "--gc-sections" ) ; 
1433+         } 
1434+     } 
1435+ 
1436+     fn  no_gc_sections ( & mut  self )  { 
1437+         self . cmd . arg ( "--no-gc-sections" ) ; 
1438+     } 
1439+ 
1440+     fn  optimize ( & mut  self )  { 
1441+         // GNU-style linkers support optimization with -O. GNU ld doesn't 
1442+         // need a numeric argument, but other linkers do. 
1443+         if  self . sess . opts . optimize  == config:: OptLevel :: Default 
1444+             || self . sess . opts . optimize  == config:: OptLevel :: Aggressive 
1445+         { 
1446+             self . cmd . arg ( "-O1" ) ; 
1447+         } 
1448+     } 
1449+ 
1450+     fn  pgo_gen ( & mut  self )  { } 
1451+ 
1452+     fn  debuginfo ( & mut  self ,  strip :  Strip )  { 
1453+         match  strip { 
1454+             Strip :: None  => { } 
1455+             Strip :: Debuginfo  => { 
1456+                 self . cmd ( ) . arg ( "--strip-debug" ) ; 
1457+             } 
1458+             Strip :: Symbols  => { 
1459+                 self . cmd ( ) . arg ( "--strip-all" ) ; 
1460+             } 
1461+         } 
1462+     } 
1463+ 
1464+     fn  no_default_libraries ( & mut  self )  { 
1465+         self . cmd . arg ( "-nostdlib" ) ; 
1466+     } 
1467+ 
1468+     fn  export_symbols ( & mut  self ,  _:  & Path ,  _:  CrateType ,  _:  & [ String ] )  { 
1469+         // ToDo, not implemented, copy from GCC 
1470+         self . sess . warn ( "exporting symbols not implemented yet for L4Bender" ) ; 
1471+         return ; 
1472+     } 
1473+ 
1474+     fn  subsystem ( & mut  self ,  subsystem :  & str )  { 
1475+         self . cmd . arg ( & format ! ( "--subsystem {}" ,  subsystem) ) ; 
1476+     } 
1477+ 
1478+     fn  reset_per_library_state ( & mut  self )  { 
1479+         self . hint_static ( ) ;  // Reset to default before returning the composed command line. 
1480+     } 
1481+ 
1482+     fn  group_start ( & mut  self )  { 
1483+         self . cmd . arg ( "--start-group" ) ; 
1484+     } 
1485+ 
1486+     fn  group_end ( & mut  self )  { 
1487+         self . cmd . arg ( "--end-group" ) ; 
1488+     } 
1489+ 
1490+     fn  linker_plugin_lto ( & mut  self )  { } 
1491+ 
1492+     fn  control_flow_guard ( & mut  self )  { } 
1493+ 
1494+     fn  no_crt_objects ( & mut  self )  { } 
1495+ } 
1496+ 
1497+ impl < ' a >  L4Bender < ' a >  { 
1498+     pub  fn  new ( cmd :  Command ,  sess :  & ' a  Session )  -> L4Bender < ' a >  { 
1499+         L4Bender  {  cmd :  cmd,  sess :  sess,  hinted_static :  false  } 
1500+     } 
1501+ 
1502+     fn  hint_static ( & mut  self )  { 
1503+         if  !self . hinted_static  { 
1504+             self . cmd . arg ( "-static" ) ; 
1505+             self . hinted_static  = true ; 
1506+         } 
1507+     } 
1508+ } 
1509+ 
13581510pub ( crate )  fn  exported_symbols ( tcx :  TyCtxt < ' _ > ,  crate_type :  CrateType )  -> Vec < String >  { 
13591511    if  let  Some ( ref  exports)  = tcx. sess . target . override_export_symbols  { 
13601512        return  exports. clone ( ) ; 
0 commit comments