Discussion:
[musl] optopt in getopt not being set, only when building with OpenWrt
Paul Sykes
2018-11-16 09:54:23 UTC
Permalink
Hi,

First post to the list, apologies in advance for any etiquette transgressions.

On my OpenWrt builds I found that the optopt variable was never set
when calling the function getopt. I tested the same code on my desktop
using the gcc wrapper and optopt was set as expected.

Debugging showed that optopt was being set correctly in getopt.c
however the variable was not being set in my calling code.

Adding optopt to the file 'dynamic.list' resolved the issue when
building with OpenWrt. I noticed that all the other extern variables
for getopt appear in dynamic.list except optopt.

Paul.
Szabolcs Nagy
2018-11-16 21:11:00 UTC
Permalink
Post by Paul Sykes
On my OpenWrt builds I found that the optopt variable was never set
when calling the function getopt. I tested the same code on my desktop
using the gcc wrapper and optopt was set as expected.
Debugging showed that optopt was being set correctly in getopt.c
however the variable was not being set in my calling code.
Adding optopt to the file 'dynamic.list' resolved the issue when
building with OpenWrt. I noticed that all the other extern variables
for getopt appear in dynamic.list except optopt.
yeah the dynamic list entry is needed so the address of the
object internally in the libc is the same as in the main
executable in case of copy relocation (only matters for
dynamic linked executables and pie executable may work
since that does not require copy relocs).

all targets with copy relocs are affected, but only musl
version 1.1.20 has the problem i think.
Rich Felker
2018-11-16 21:38:45 UTC
Permalink
Post by Szabolcs Nagy
Post by Paul Sykes
On my OpenWrt builds I found that the optopt variable was never set
when calling the function getopt. I tested the same code on my desktop
using the gcc wrapper and optopt was set as expected.
Debugging showed that optopt was being set correctly in getopt.c
however the variable was not being set in my calling code.
Adding optopt to the file 'dynamic.list' resolved the issue when
building with OpenWrt. I noticed that all the other extern variables
for getopt appear in dynamic.list except optopt.
Yes, this is exactly right. It seems to have been an oversight. I'll
push a fix for inclusion in 1.1.21, and distros using 1.1.20 should
apply it since this is a notable regression. However,
Post by Szabolcs Nagy
yeah the dynamic list entry is needed so the address of the
object internally in the libc is the same as in the main
executable in case of copy relocation (only matters for
dynamic linked executables and pie executable may work
since that does not require copy relocs).
all targets with copy relocs are affected, but only musl
version 1.1.20 has the problem i think.
On distros using default-pie, the impact might be low, depending on
arch, gcc version, and CFLAGS. There's never a *need* to use copy
relocations with pie, and at one point gcc never did, but I think with
current tooling it's more complicated whether copy relocations get
used or not.

Rich

Loading...