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

Dmitry Safonov 0x7f454c46 at gmail.com
Mon Oct 17 01:43:56 PDT 2016


2016-10-14 21:33 GMT+03:00 Kir Kolyshkin <kir at virtuozzo.com>:
>
>
> 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.

That's ok - `override' directive would make it work for %.o objects only.
(Sorry, have answerd outside criu-maillist - from mobile phone).

>>
>>>> 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.
>>>>
>>>
>>
>>

-- 
             Dmitry


More information about the CRIU mailing list