[Bug 1954598] [NEW] gcc ignores large _Alignas specifiers on static .bss data
ais523
1954598 at bugs.launchpad.net
Sun Dec 12 17:16:28 UTC 2021
Public bug reported:
Instructions to reproduce: compile the following C program:
```
#include <stdio.h>
static _Alignas(4 << 20) int x;
int main(void) {
printf("%#llx\n", (long long) &x);
return 0;
}
```
using `gcc` with no arguments other than the program's filename (which
must end `.c` so that gcc interprets it as a C program), and run the
resulting a.out.
Expected behaviour: the program prints a number that's divisible by 2²²
(in hexadecimal, the resulting number will end with five zeroes, and the
preceding digit will be divisible by 4).
Actual behaviour: the program prints an arbitrary number that's
divisible by 2¹², but which is normally not divisible by 2²². (The exact
number varies between runs of the program; some example observed values
include 0x55c2be889000 and 0x55d2cd348000.)
This bug seems to be somehow specific to the way Ubuntu has configured
`gcc` – it doesn't show up on a Red Hat-based Linux system, or when
compiling using `clang`. As far as I can tell, the bug isn't in the
compiler portion of `gcc`, but rather in the driver process; something
in the arguments that it's passing to the linker is causing this
behaviour.
I suspect that the bug is related to position independent code. (In
particular, compiling with `gcc -fno-pie` will cause an error along the
line of `/usr/bin/ld: /tmp/cc6nztmN.o: relocation R_X86_64_32 against
`.bss' can not be used when making a PIE object; recompile with -fPIE`,
rather than linking successfully, which means that the linker has been
told by the compiler to make a position-independent executable even when
the user explicitly tells it not to.)
It is possible that this misbehaviour has been introduced intentionally
for security reasons (because requiring a large alignment for the
program image reduces the amount of security that address space layout
randomization can provide). However, in this case, I think the correct
behaviour should be to reject the program with an error, rather than
apparently compiling it successfully, but producing a program that gives
incorrect results at runtime.
ProblemType: Bug
DistroRelease: Ubuntu 20.04
Package: gcc 4:9.3.0-1ubuntu2
ProcVersionSignature: Ubuntu 5.4.0-91.102-generic 5.4.151
Uname: Linux 5.4.0-91-generic x86_64
ApportVersion: 2.20.11-0ubuntu27.21
Architecture: amd64
CasperMD5CheckResult: skip
CurrentDesktop: X-Cinnamon
Date: Sun Dec 12 17:01:45 2021
InstallationDate: Installed on 2019-11-11 (761 days ago)
InstallationMedia: Ubuntu 18.04.3 LTS "Bionic Beaver" - Release amd64 (20190805)
SourcePackage: gcc-defaults
UpgradeStatus: Upgraded to focal on 2020-10-02 (436 days ago)
** Affects: gcc-defaults (Ubuntu)
Importance: Undecided
Status: New
** Tags: amd64 apport-bug focal third-party-packages
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-defaults in Ubuntu.
https://bugs.launchpad.net/bugs/1954598
Title:
gcc ignores large _Alignas specifiers on static .bss data
Status in gcc-defaults package in Ubuntu:
New
Bug description:
Instructions to reproduce: compile the following C program:
```
#include <stdio.h>
static _Alignas(4 << 20) int x;
int main(void) {
printf("%#llx\n", (long long) &x);
return 0;
}
```
using `gcc` with no arguments other than the program's filename (which
must end `.c` so that gcc interprets it as a C program), and run the
resulting a.out.
Expected behaviour: the program prints a number that's divisible by
2²² (in hexadecimal, the resulting number will end with five zeroes,
and the preceding digit will be divisible by 4).
Actual behaviour: the program prints an arbitrary number that's
divisible by 2¹², but which is normally not divisible by 2²². (The
exact number varies between runs of the program; some example observed
values include 0x55c2be889000 and 0x55d2cd348000.)
This bug seems to be somehow specific to the way Ubuntu has configured
`gcc` – it doesn't show up on a Red Hat-based Linux system, or when
compiling using `clang`. As far as I can tell, the bug isn't in the
compiler portion of `gcc`, but rather in the driver process; something
in the arguments that it's passing to the linker is causing this
behaviour.
I suspect that the bug is related to position independent code. (In
particular, compiling with `gcc -fno-pie` will cause an error along
the line of `/usr/bin/ld: /tmp/cc6nztmN.o: relocation R_X86_64_32
against `.bss' can not be used when making a PIE object; recompile
with -fPIE`, rather than linking successfully, which means that the
linker has been told by the compiler to make a position-independent
executable even when the user explicitly tells it not to.)
It is possible that this misbehaviour has been introduced
intentionally for security reasons (because requiring a large
alignment for the program image reduces the amount of security that
address space layout randomization can provide). However, in this
case, I think the correct behaviour should be to reject the program
with an error, rather than apparently compiling it successfully, but
producing a program that gives incorrect results at runtime.
ProblemType: Bug
DistroRelease: Ubuntu 20.04
Package: gcc 4:9.3.0-1ubuntu2
ProcVersionSignature: Ubuntu 5.4.0-91.102-generic 5.4.151
Uname: Linux 5.4.0-91-generic x86_64
ApportVersion: 2.20.11-0ubuntu27.21
Architecture: amd64
CasperMD5CheckResult: skip
CurrentDesktop: X-Cinnamon
Date: Sun Dec 12 17:01:45 2021
InstallationDate: Installed on 2019-11-11 (761 days ago)
InstallationMedia: Ubuntu 18.04.3 LTS "Bionic Beaver" - Release amd64 (20190805)
SourcePackage: gcc-defaults
UpgradeStatus: Upgraded to focal on 2020-10-02 (436 days ago)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1954598/+subscriptions
More information about the foundations-bugs
mailing list