[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] STACK_PROTECTOR: Support symbols emitted by windows compiler
From: |
Daniel Kiper |
Subject: |
Re: [PATCH] STACK_PROTECTOR: Support symbols emitted by windows compiler |
Date: |
Thu, 4 Apr 2024 22:47:45 +0200 |
User-agent: |
NeoMutt/20170113 (1.7.2) |
Adding Ard, Glenn and Dave...
First of all, sorry for late reply but I was busy with other stuff...
On Fri, Mar 15, 2024 at 09:43:22PM +0300, Vladimir 'phcoder' Serbinenko wrote:
> stack protector needs symbols with just one underscore in C
> name unlike unix variant that needs double underscore.
> Supply both symbols for simplicity
>
> Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
I do not like your solution because it adds unneeded code/symbols to
some EFI builds. I come up with two other solutions.
First, let's define an alias when using MinGW build environment:
diff --git a/include/grub/stack_protector.h b/include/grub/stack_protector.h
index c88dc00b5..8d99fd50e 100644
--- a/include/grub/stack_protector.h
+++ b/include/grub/stack_protector.h
@@ -25,6 +25,10 @@
#ifdef GRUB_STACK_PROTECTOR
extern grub_addr_t EXPORT_VAR (__stack_chk_guard);
extern void __attribute__ ((noreturn)) EXPORT_FUNC (__stack_chk_fail) (void);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+static grub_addr_t __attribute__ ((weakref("__stack_chk_guard"))) EXPORT_VAR
(_stack_chk_guard);
+static void __attribute__ ((noreturn, weakref("__stack_chk_fail")))
EXPORT_FUNC (_stack_chk_fail) (void);
+#endif
#endif
#endif /* GRUB_STACK_PROTECTOR_H */
Tested and it works. We have to use weakref() instead of alias() due to
definition in separate translation unit.
Second, do not drop leading underscore:
diff --git a/conf/Makefile.common b/conf/Makefile.common
index b8f216f6c..fd20f6b4e 100644
--- a/conf/Makefile.common
+++ b/conf/Makefile.common
@@ -38,7 +38,7 @@ CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1
BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT)
CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding
-LDFLAGS_KERNEL = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
+LDFLAGS_KERNEL = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
-Wl,--leading-underscore
CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve
-R .note.gnu.gold-version -R .MIPS.abiflags -R .ARM.exidx
@@ -51,12 +51,12 @@ endif
endif
CFLAGS_MODULE = $(CFLAGS_PLATFORM) -ffreestanding
-LDFLAGS_MODULE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
-Wl,-r
+LDFLAGS_MODULE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
-Wl,-r -Wl,--leading-underscore
CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
CCASFLAGS_MODULE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
CFLAGS_IMAGE = $(CFLAGS_PLATFORM) -fno-builtin
-LDFLAGS_IMAGE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S
+LDFLAGS_IMAGE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
-Wl,-S -Wl,--leading-underscore
CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
CCASFLAGS_IMAGE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
diff --git a/grub-core/genmod.sh.in b/grub-core/genmod.sh.in
index e57c4d920..04b680ad0 100644
--- a/grub-core/genmod.sh.in
+++ b/grub-core/genmod.sh.in
@@ -83,9 +83,9 @@ else
for dep in $deps; do echo "char moddep_$dep[] __attribute__
((section(\"_moddeps, _moddeps\"))) = \"$dep\";" >>$t2; done
if test -n "$deps"; then
- @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib -o $tmpfile2 $t1
$t2 $tmpfile -Wl,-r
+ @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib
-Wl,--leading-underscore -o $tmpfile2 $t1 $t2 $tmpfile -Wl,-r
else
- @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib -o $tmpfile2 $t1
$tmpfile -Wl,-r
+ @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib
-Wl,--leading-underscore -o $tmpfile2 $t1 $tmpfile -Wl,-r
fi
rm -f $t1 $t2 $tmpfile
mv $tmpfile2 $tmpfile
diff --git a/util/grub-pe2elf.c b/util/grub-pe2elf.c
index 11331294f..233118252 100644
--- a/util/grub-pe2elf.c
+++ b/util/grub-pe2elf.c
@@ -71,7 +71,7 @@ insert_string (const char *name)
{
int len, result;
- if (*name == '_')
+ if (*name == '_' && !strcmp("__stack_chk_fail", name) &&
!strcmp("__stack_chk_guard", name))
name++;
len = strlen (name);
This one works too. However, it breaks normal builds. So, it requires some
tweaking to make it production ready.
Anyway, I prefer first solution because it is simpler. I do not mention
that the second one may break other symbols with leading underscore.
What do you think?
Daniel