[CRIU] [PATCH 05/23] Makefiles: move -Wa, --noexecstack out of CFLAGS

Kir Kolyshkin kir at virtuozzo.com
Fri Oct 14 11:33:19 PDT 2016



On 10/14/2016 11:17 AM, Dmitry Safonov wrote:
> On 10/14/2016 09:15 PM, Kir Kolyshkin wrote:
>> On 10/14/2016 02:40 AM, Dmitry Safonov wrote:
>>> On 10/14/2016 04:42 AM, Kir Kolyshkin wrote:
>>>> On 10/13/2016 05:19 AM, Pavel Emelyanov wrote:
>>>>> On 10/12/2016 04:46 AM, Kir Kolyshkin wrote:
>>>>>> The problem is, -Wa is a flag for assembler, but CFLAGS are also 
>>>>>> used
>>>>>> to generate dependencies, and clang complains loudly when it is used
>>>>>> for deps:
>>>>>>
>>>>>>>    DEP compel/arch/x86/plugins/std/syscalls-64.d
>>>>>>>   clang-3.8: error: argument unused during compilation:
>>>>>>> '-Wa,--noexecstack'
>>>>>> This patch moved the noexecflag from assembler to linker. I am not
>>>>>> 100% sure but the end result seems to be the same.
>>>>> Cyrill, Dima what would you say?
>>>>
>>>> I surely have done my research before proposing this change, and
>>>> I have tested this change as good as I could.
>>>> Sorry, I should have provided more background in the commit message.
>>>> Here it goes.
>>>>
>>>> There are a few ways to have non-executable stack:
>>>> 1. mark the assembler source file (.S) with .section
>>>> .note.GNU-stack,"",%progbits
>>>> 2. pass the -Wa,--noexecstack to compiler
>>>> 3. pass the -z execstack to linker
>>>>
>>>> All three ways are fine, let's see them in greater details.
>>>>
>>>> Some people say (1) is the best way, but we have way too many
>>>> .S files now (23 of them, to be exact). Anyway, I can certainly do it
>>>> this way if you like, just let me know. It would look like this:
>>>>
>>>> diff --git a/compel/arch/aarch64/plugins/std/syscalls/syscall-aux.S
>>>> b/compel/arch/aarch64/plugins/std/syscalls/syscall-aux.S
>>>> index 00ccf79..4091680 100644
>>>> --- a/compel/arch/aarch64/plugins/std/syscalls/syscall-aux.S
>>>> +++ b/compel/arch/aarch64/plugins/std/syscalls/syscall-aux.S
>>>> @@ -3,6 +3,8 @@
>>>>   * that are not implemented in the AArch64 Linux kernel
>>>>   */
>>>>
>>>> +.section .note.GNU-stack,"",%progbits
>>>> +
>>>>  ENTRY(sys_open)
>>>>         mov x3, x2
>>>>         mov x2, x1
>>>>
>>>>
>>>> Way (2) is what is currently used. Unfortunately it breaks dependency
>>>> generation with clang. One way to fix it would be to filter-out the 
>>>> bad
>>>> flag when we're generating deps. I tried experimenting with
>>>> $(filter-out) function in Makefiles today but it's complicated and I
>>>> failed
>>>> to make it work.
>>>>
>>>> Way (3) is what this commit offers. It seem to work fine while being
>>>> the least intrusive.
>>>>
>>>> Let me know what you think.
>>>>
>>>> Kir.
>>>
>>> There is also an option to provide this somehow like:
>>> %.o: override AFLAGS += -Wa,--noexecstack
>>
>> That's same (or very similar to) as (2) above (and similar to the way
>> it was done before). Same consequences -- breaks dependency generation
>> with clang.
>
> No, it will pass AFLAGS only for %.o files, but not for %.d.
> Anyway again, I don't think it's prettier than ldflags and may need
> to be more target-specific.


I'm afraid it's not the case. Check scripts/nmk/scripts/build.mk, it has 
this

define nmk-asflags
         $(CFLAGS) $(AFLAGS) $(asflags-y) $(AFLAGS_$(@F))
endef

and then $(nmk-asflags) are used for everything that involves .S as a 
source.


>
>>> but I belive what you got with ldflags is nicer.
>>> Let's tryout - no obivious reasons why it may broke something,
>>> so if it will anyway - we'll fix it on the top.
>>>
>>
>
>



More information about the CRIU mailing list