Skip to content

Conversation

yonghong-song
Copy link
Contributor

The kernel libbpf does not need .note.GNU-stack section. If not filtering out in llvm, the section will be filtered out in libbpf. So let us filter it out as early as possible which is in llvm.

Change function getNonexecutableStackSection() in MCAsmInfoELF.h from 'final' to 'override' so target (e.g. BPF) can decide whether '.note.GNU-stack' section should be emitted or not.

The following is an example.

  $ cat t.c
  int test() { return 5; }

Without this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000047 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .note.GNU-stack   PROGBITS        0000000000000000 0000c2 000000 00      0   0  1
  [ 5] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  6   0  1
  [ 6] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

With this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000037 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  5   0  1
  [ 5] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

The kernel libbpf does not need .note.GNU-stack section. If not
filtering out in llvm, the section will be filtered out in libbpf.
So let us filter it out as early as possible which is in llvm.

Change function getNonexecutableStackSection() in MCAsmInfoELF.h
from 'final' to 'override' so target (e.g. BPF) can decide
whether '.note.GNU-stack' section should be emitted or not.

The following is an example.
  $ cat t.c
  int test() { return 5; }

Without this change:
  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000047 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .note.GNU-stack   PROGBITS        0000000000000000 0000c2 000000 00      0   0  1
  [ 5] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  6   0  1
  [ 6] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

With this change:
  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000037 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  5   0  1
  [ 5] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8
@llvmbot llvmbot added the llvm:mc Machine (object) code label Sep 21, 2025
@llvmbot
Copy link
Member

llvmbot commented Sep 21, 2025

@llvm/pr-subscribers-llvm-mc

Author: None (yonghong-song)

Changes

The kernel libbpf does not need .note.GNU-stack section. If not filtering out in llvm, the section will be filtered out in libbpf. So let us filter it out as early as possible which is in llvm.

Change function getNonexecutableStackSection() in MCAsmInfoELF.h from 'final' to 'override' so target (e.g. BPF) can decide whether '.note.GNU-stack' section should be emitted or not.

The following is an example.

  $ cat t.c
  int test() { return 5; }

Without this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000047 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .note.GNU-stack   PROGBITS        0000000000000000 0000c2 000000 00      0   0  1
  [ 5] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  6   0  1
  [ 6] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

With this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000037 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  5   0  1
  [ 5] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

Full diff: https://github.com/llvm/llvm-project/pull/159960.diff

2 Files Affected:

  • (modified) llvm/include/llvm/MC/MCAsmInfoELF.h (+1-1)
  • (modified) llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h (+4)
diff --git a/llvm/include/llvm/MC/MCAsmInfoELF.h b/llvm/include/llvm/MC/MCAsmInfoELF.h
index c05e4ad78ecd1..e0678888d1003 100644
--- a/llvm/include/llvm/MC/MCAsmInfoELF.h
+++ b/llvm/include/llvm/MC/MCAsmInfoELF.h
@@ -15,7 +15,7 @@ namespace llvm {
 
 class MCAsmInfoELF : public MCAsmInfo {
   virtual void anchor();
-  MCSection *getNonexecutableStackSection(MCContext &Ctx) const final;
+  MCSection *getNonexecutableStackSection(MCContext &Ctx) const override;
   void printSwitchToSection(const MCSection &, uint32_t, const Triple &,
                             raw_ostream &) const final;
   bool useCodeAlign(const MCSection &Sec) const final;
diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
index 63d6e6fb630a6..2198ed8c9034b 100644
--- a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
+++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
@@ -47,6 +47,10 @@ class BPFMCAsmInfo : public MCAsmInfoELF {
   void setDwarfUsesRelocationsAcrossSections(bool enable) {
     DwarfUsesRelocationsAcrossSections = enable;
   }
+
+  MCSection *getNonexecutableStackSection(MCContext &Ctx) const override {
+    return nullptr;
+  }
 };
 }
 

Copy link
Member

@4ast 4ast left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link
Member

@MaskRay MaskRay left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively, change MCAsmInfoELF::getNonexecutableStackSection . It already has a Ctx.getTargetTriple().isOSSolaris() check.

@yonghong-song
Copy link
Contributor Author

Alternatively, change MCAsmInfoELF::getNonexecutableStackSection . It already has a Ctx.getTargetTriple().isOSSolaris() check.

I thought about this as well. But ultimately I think allowing backend to override is a better choice as it will avoid adding arch specific checks in generic MCAsmInfoELF.

@yonghong-song yonghong-song merged commit 1d381ac into llvm:main Sep 22, 2025
11 checks passed
SeongjaeP pushed a commit to SeongjaeP/llvm-project that referenced this pull request Sep 23, 2025
The kernel libbpf does not need .note.GNU-stack section. If not
filtering out in llvm, the section will be filtered out in libbpf. So
let us filter it out as early as possible which is in llvm.

Change function getNonexecutableStackSection() in MCAsmInfoELF.h from
'final' to 'override' so target (e.g. BPF) can decide whether
'.note.GNU-stack' section should be emitted or not.

The following is an example.

  $ cat t.c
  int test() { return 5; }

Without this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000047 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .note.GNU-stack   PROGBITS        0000000000000000 0000c2 000000 00      0   0  1
  [ 5] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  6   0  1
  [ 6] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000037 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  5   0  1
  [ 5] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8
YixingZhang007 pushed a commit to YixingZhang007/llvm-project that referenced this pull request Sep 27, 2025
The kernel libbpf does not need .note.GNU-stack section. If not
filtering out in llvm, the section will be filtered out in libbpf. So
let us filter it out as early as possible which is in llvm.

Change function getNonexecutableStackSection() in MCAsmInfoELF.h from
'final' to 'override' so target (e.g. BPF) can decide whether
'.note.GNU-stack' section should be emitted or not.

The following is an example.

  $ cat t.c
  int test() { return 5; }

Without this change:

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000047 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .note.GNU-stack   PROGBITS        0000000000000000 0000c2 000000 00      0   0  1
  [ 5] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  6   0  1
  [ 6] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8

  $ llvm-readelf -S t.o
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .strtab           STRTAB          0000000000000000 000110 000037 00      0   0  1
  [ 2] .text             PROGBITS        0000000000000000 000040 000010 00  AX  0   0  8
  [ 3] .comment          PROGBITS        0000000000000000 000050 000072 01  MS  0   0  1
  [ 4] .llvm_addrsig     LLVM_ADDRSIG    0000000000000000 000110 000000 00   E  5   0  1
  [ 5] .symtab           SYMTAB          0000000000000000 0000c8 000048 18      1   2  8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
llvm:mc Machine (object) code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants