http://bugs.gentoo.org/show_bug.cgi?id=228867 http://mantis.freepascal.org/view.php?id=11563 --- fpcbuild-2.2.2/fpcsrc/compiler/aggas.pas +++ fpcbuild-2.2.2/fpcsrc/compiler/aggas.pas @@ -1074,6 +1074,13 @@ (target_info.system in systems_darwin) then AsmWriteLn(#9'.subsections_via_symbols'); + { "no executable stack" marker for Linux } + if (target_info.system in system_linux) and + not(cs_executable_stack in current_settings.moduleswitches) then + begin + AsmWriteLn('.section .note.GNU-stack,"",%progbits'); + end; + AsmLn; {$ifdef EXTDEBUG} if assigned(current_module.mainsource) then --- fpcbuild-2.2.2/fpcsrc/compiler/globtype.pas +++ fpcbuild-2.2.2/fpcsrc/compiler/globtype.pas @@ -109,7 +109,9 @@ { linking } cs_create_smart,cs_create_dynamic,cs_create_pic, { browser switches are back } - cs_browser,cs_local_browser + cs_browser,cs_local_browser, + { target specific } + cs_executable_stack ); tmoduleswitches = set of tmoduleswitch; --- fpcbuild-2.2.2/fpcsrc/compiler/msg/errore.msg +++ fpcbuild-2.2.2/fpcsrc/compiler/msg/errore.msg @@ -2704,6 +2704,7 @@ 3*1W_Target-specific options (targets) A*1W_Target-specific options (targets) P*1W_Target-specific options (targets) +p*1W_Target-specific options (targets) 3*2Wb_Create a bundle instead of a library (Darwin) P*2Wb_Create a bundle instead of a library (Darwin) p*2Wb_Create a bundle instead of a library (Darwin) @@ -2723,6 +2724,10 @@ 3*2WR_Generate relocation code (Windows) A*2WR_Generate relocation code (Windows) P*2WT_Specify MPW tool type application (Classic Mac OS) +3*2WX_Enable executable stack (Linux) +A*2WX_Enable executable stack (Linux) +p*2WX_Enable executable stack (Linux) +P*2WX_Enable executable stack (Linux) **1X_Executable options: **2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Linux) **2Xd_Do not use standard library search path (needed for cross compile) --- fpcbuild-2.2.2/fpcsrc/compiler/msgidx.inc +++ fpcbuild-2.2.2/fpcsrc/compiler/msgidx.inc @@ -740,7 +740,7 @@ option_info=11024; option_help_pages=11025; - MsgTxtSize = 46171; + MsgTxtSize = 46365; MsgIdxMax : array[1..20] of longint=( 24,87,250,84,63,50,108,22,135,61, --- fpcbuild-2.2.2/fpcsrc/compiler/msgtxt.inc +++ fpcbuild-2.2.2/fpcsrc/compiler/msgtxt.inc @@ -1,7 +1,7 @@ {$ifdef Delphi} -const msgtxt : array[0..000192] of string[240]=( +const msgtxt : array[0..000193] of string[240]=( {$else Delphi} -const msgtxt : array[0..000192,1..240] of char=( +const msgtxt : array[0..000193,1..240] of char=( {$endif Delphi} '01000_T_Compiler: $1'#000+ '01001_D_Compiler OS: $1'#000+ @@ -1055,48 +1055,53 @@ '3*1W_Target-specific options (targets)'#010+ 'A*1W_Target-specific options (targets)'#010+ 'P*1W_Target-specific options (targets)'#010+ - '3*2Wb_Create a bundle instead of a ','library (Darwin)'#010+ + 'p*1W_Target-specific options (ta','rgets)'#010+ + '3*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'P*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'p*2Wb_Create a bundle instead of a library (Darwin)'#010+ '3*2WB_Create a relocatable image (Windows)'#010+ - 'A*2WB_Create a relocatable image (Windows, Symbian)'#010+ - '3*2WC_Specify console ty','pe application (EMX, OS/2, Windows)'#010+ + 'A*2WB_Create a relocatable image (','Windows, Symbian)'#010+ + '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+ 'A*2WC_Specify console type application (Windows)'#010+ 'P*2WC_Specify console type application (Classic Mac OS)'#010+ - '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+ - 'A*2WD_Use DEFFILE to export functions',' of DLL or EXE (Windows)'#010+ + '3*2WD_Use DEFFILE to export functions of DLL or EXE (Wind','ows)'#010+ + 'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+ '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+ '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+ 'A*2WG_Specify graphic type application (Windows)'#010+ - 'P*2WG_Specify graphic type application (Classic Mac',' OS)'#010+ + 'P*2WG_Spe','cify graphic type application (Classic Mac OS)'#010+ '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ 'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ '3*2WR_Generate relocation code (Windows)'#010+ - 'A*2WR_Generate relocation code (Windows)'#010+ - 'P*2WT_Specify',' MPW tool type application (Classic Mac OS)'#010+ - '**1X_Executable options:'#010+ + 'A*2WR_Genera','te relocation code (Windows)'#010+ + 'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+ + '3*2WX_Enable executable stack (Linux)'#010+ + 'A*2WX_Enable executable stack (Linux)'#010+ + 'p*2WX_Enable executable stack (Linux)'#010+ + 'P*2WX_Enable executable stack (Linux)'#010+ + '**','1X_Executable options:'#010+ '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+ 'ux)'#010+ '**2Xd_Do not use standard library search path (needed for cross compil'+ 'e)'#010+ - '**2Xe_Use external linke','r'#010+ - '**2Xg_Create debuginfo in a separate file and add a debuglink section '+ - 'to executable'#010+ + '**2Xe_Use external linker'#010+ + '**2Xg_Create debuginfo in a separate file an','d add a debuglink sectio'+ + 'n to executable'#010+ '**2XD_Try to link units dynamically (defines FPC_LINK_DYNAMIC)'#010+ '**2Xi_Use internal linker'#010+ '**2Xm_Generate link map'#010+ - '**2XM_Set the name of the '#039'main'#039' ','program routine (default'+ - ' is '#039'main'#039')'#010+ - '**2XP_Prepend the binutils names with the prefix '#010+ + '**2XM_Set the name of the '#039'main'#039' program routine (default i'+ + 's '#039'main'#039')'#010+ + '**2XP_P','repend the binutils names with the prefix '#010+ '**2Xr_Set library search path to (needed for cross compile) (Be'+ 'OS, Linux)'#010+ - '**2XR_Prepend to all linker search paths (BeOS, Darwin, Free','B'+ - 'SD, Linux, Mac OS, Solaris)'#010+ - '**2Xs_Strip all symbols from executable'#010+ + '**2XR_Prepend to all linker search paths (BeOS, Darwin, FreeBSD'+ + ', Linux, Mac OS, Solaris)'#010+ + '**2Xs_Strip all s','ymbols from executable'#010+ '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+ '**2Xt_Link with static libraries (-static is passed to linker)'#010+ - '**2XX_Try to smartlink units ',' (defines FPC_LINK_SMART)'#010+ + '**2XX_Try to smartlink units (defines FPC_LINK_SMART)'#010+ '**1*_'#010+ - '**1?_Show this help'#010+ + '**1?_Show th','is help'#010+ '**1h_Shows this help without waiting'#000 ); --- fpcbuild-2.2.2/fpcsrc/compiler/ogelf.pas +++ fpcbuild-2.2.2/fpcsrc/compiler/ogelf.pas @@ -1021,6 +1021,10 @@ symtabsect:=TElfObjSection.create_ext(ObjSectionList,'.symtab',SHT_SYMTAB,0,0,0,4,sizeof(telfsymbol)); strtabsect:=TElfObjSection.create_ext(ObjSectionList,'.strtab',SHT_STRTAB,0,0,0,1,0); shstrtabsect:=TElfObjSection.create_ext(ObjSectionList,'.shstrtab',SHT_STRTAB,0,0,0,1,0); + { "no executable stack" marker for Linux } + if (target_info.system in system_linux) and + not(cs_executable_stack in current_settings.moduleswitches) then + TElfObjSection.create_ext(ObjSectionList,'.note.GNU-stack',SHT_PROGBITS,0,0,0,1,0); { insert the empty and filename as first in strtab } strtabsect.writestr(#0); strtabsect.writestr(ExtractFileName(current_module.mainsource^)+#0); --- fpcbuild-2.2.2/fpcsrc/compiler/options.pas +++ fpcbuild-2.2.2/fpcsrc/compiler/options.pas @@ -1357,6 +1357,18 @@ else apptype:=app_tool; end; + 'X': + begin + if (target_info.system in system_linux) then + begin + if UnsetBool(More, j) then + exclude(init_settings.moduleswitches,cs_executable_stack) + else + include(init_settings.moduleswitches,cs_executable_stack) + end + else + IllegalPara(opt); + end else IllegalPara(opt); end; --- fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/cprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/cprt0.as @@ -135,3 +135,5 @@ 2: .long 0 .long 2,0,0 3: .align 4 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/gprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/gprt0.as @@ -90,3 +90,4 @@ .long 2,0,0 3: .align 4 +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/prt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/prt0.as @@ -108,3 +108,5 @@ 2: .long 0 .long 2,0,0 3: .align 4 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/ucprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/arm/ucprt0.as @@ -178,3 +178,5 @@ 2: .long 0 .long 2,0,0 3: .align 4 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/cprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/cprt0.as @@ -105,3 +105,5 @@ .set operatingsystem_parameter_envp,operatingsystem_parameters+0 .set operatingsystem_parameter_argc,operatingsystem_parameters+4 .set operatingsystem_parameter_argv,operatingsystem_parameters+8 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/cprt21.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/cprt21.as @@ -122,3 +122,5 @@ .set operatingsystem_parameter_envp,operatingsystem_parameters+0 .set operatingsystem_parameter_argc,operatingsystem_parameters+4 .set operatingsystem_parameter_argv,operatingsystem_parameters+8 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/dllprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/dllprt0.as @@ -72,3 +72,4 @@ .set operatingsystem_parameter_argc,operatingsystem_parameters+4 .set operatingsystem_parameter_argv,operatingsystem_parameters+8 +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/gprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/gprt0.as @@ -87,3 +87,5 @@ .set operatingsystem_parameter_envp,operatingsystem_parameters+0 .set operatingsystem_parameter_argc,operatingsystem_parameters+4 .set operatingsystem_parameter_argv,operatingsystem_parameters+8 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/gprt21.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/gprt21.as @@ -136,3 +136,4 @@ .set operatingsystem_parameter_argc,operatingsystem_parameters+4 .set operatingsystem_parameter_argv,operatingsystem_parameters+8 +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/prt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/i386/prt0.as @@ -109,3 +109,4 @@ //.section .threadvar,"aw",@nobits .comm ___fpc_threadvar_offset,4 +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc/cprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc/cprt0.as @@ -117,3 +117,4 @@ .comm operatingsystem_parameter_argc, 4 .comm operatingsystem_parameter_argv, 4 +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc/prt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc/prt0.as @@ -67,3 +67,5 @@ .comm operatingsystem_parameter_envp,4 .comm operatingsystem_parameter_argc,4 .comm operatingsystem_parameter_argv,4 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/cprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/cprt0.as @@ -433,3 +433,5 @@ .comm operatingsystem_parameter_argc, 4 .comm operatingsystem_parameter_argv, 8 .comm operatingsystem_parameter_envp, 8 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/gprt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/gprt0.as @@ -439,3 +439,5 @@ .comm operatingsystem_parameter_argc, 4 .comm operatingsystem_parameter_argv, 8 .comm operatingsystem_parameter_envp, 8 + +.section .note.GNU-stack,"",%progbits --- fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/prt0.as +++ fpcbuild-2.2.2/fpcsrc/rtl/linux/powerpc64/prt0.as @@ -376,3 +376,4 @@ .comm operatingsystem_parameter_argv, 8 .comm operatingsystem_parameter_envp, 8 +.section .note.GNU-stack,"",%progbits --- /dev/null +++ fpcbuild-2.2.2/fpcsrc/tests/webtbs/tw11563.pp @@ -0,0 +1,40 @@ +{ %target=linux} +{ %result=216 } + +program ExecStack; + procedure DoIt; + type + proc = procedure; + var +{$if defined(cpupowerpc) or defined(cpupowerpc64)} + ret: longint; +{$endif} +{$if defined(cpui386) or defined(cpux86_64)} + ret: Byte; +{$endif} +{$ifdef cpuarm} + 'add arm code to test stack execution' +{$endif} + DoNothing: proc; + + begin +{$if defined(cpupowerpc) or defined(cpupowerpc64)} + { can't use proc(@ret) because linux/ppc64 always expects some kind of + trampoline + } + ret := ($4e shl 24) or ($80 shl 16) or ($00 shl 8) or $20; + asm + la r0, ret + mtctr r0 + bctrl + end; +{$endif} +{$if defined(cpui386) or defined(cpux86_64)} + ret := $C3; + DoNothing := proc(@ret); + DoNothing; +{$endif} + end; +begin + DoIt; +end.