-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[MC][BPF] Avoid generating .note.GNU-stack section #159960
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MC][BPF] Avoid generating .note.GNU-stack section #159960
Conversation
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
@llvm/pr-subscribers-llvm-mc Author: None (yonghong-song) ChangesThe 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.
Without this change:
With this change:
Full diff: https://github.com/llvm/llvm-project/pull/159960.diff 2 Files Affected:
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;
+ }
};
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
There was a problem hiding this 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.
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. |
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
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
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.
Without this change:
With this change: