Remembering not easily reproducible issue from back in April:
https://gitter.im/esp8266/Arduino?at=606c9a5c0147fb05c5de1d59
I noticed these flags after the section name string in the PSTR(...) macro:
|
#define PSTRN(s,n) (__extension__({static const char __pstr__[] __attribute__((__aligned__(n))) __attribute__((section( "\".irom0.pstr." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\", \"aSM\", @progbits, 1 #"))) = (s); &__pstr__[0];})) |
Per https://sourceware.org/binutils/docs/as/Section.html#index-Section-Stack-3
For sections with both M and S, a string which is a suffix of a larger string is considered a duplicate. Thus "def" will be merged with "abcdef"; A reference to the first "def" will be changed to a reference to "abcdef"+3.
If such offset had happened on pstr... what does that look like for const char[] arrays used across the app? Is it an actually desired behaviour since the resulting pointer would (?) not be aligned?
Some extra info, sorry for blowing the text size :)
I still have the offending .bin & .elf generated back in april and still with gcc10.2 timestamped 201223, but not the rest of the build directory including the suggested .map file and neither the (possibly broken?) sources that generated it. What I meant it looked like:
4026fa70 <_mqttInitCommands()::__pstr__>:
4026fa70: 514d 5454 492e 464e 004f 0000 MQTT.INFO...
However, dumping the code with current toolchain & code:
(with only change being the namespace { ... } surrounding the function, and looking at objdump it inlined the function into the one it is called from)
40282678 <(anonymous namespace)::_mqttInitCommands()::__pstr__>:
40282678: 514d 5454 492e 464e 004f 0000 MQTT.INFO...
40282684 <(anonymous namespace)::_mqttInitCommands()::__pstr__>:
40282684: 514d 5454 522e 5345 5445 0000 MQTT.RESET..
And, there are some instances where the 'merging' seems to happen on strings like F("FACTORY.RESET") e.g. settingsInitCommands() here uses it, and terminal function contains F("RESET"):
4028187c <(anonymous namespace)::_settingsInitCommands()::__pstr__>:
4028187c: 4146 5443 524f 2e59 FACTORY.
40281884 <(anonymous namespace)::_terminalInitCommands()::__pstr__>:
40281884: 4552 4553 0054 0000 RESET...
asm code for the April build _mqttInitCommands() is slightly different as well, but I am not sure what to look at there for
Since then, I was not really been able to reproduce this issue (reliably, or even at all, and do not have some kind of small example that could showcase the issue), but I wonder if the 'merge' flag somehow messed with the pointers. Or it is something related to gcc / binutils / different order of .o files when linking / etc., and it was silently resolved due to updates.
Remembering not easily reproducible issue from back in April:
https://gitter.im/esp8266/Arduino?at=606c9a5c0147fb05c5de1d59
I noticed these flags after the section name string in the PSTR(...) macro:
newlib-xtensa/newlib/libc/sys/xtensa/sys/pgmspace.h
Line 44 in 85c33ba
Per https://sourceware.org/binutils/docs/as/Section.html#index-Section-Stack-3
If such offset had happened on pstr... what does that look like for const char[] arrays used across the app? Is it an actually desired behaviour since the resulting pointer would (?) not be aligned?
Some extra info, sorry for blowing the text size :)
I still have the offending .bin & .elf generated back in april and still with gcc10.2 timestamped 201223, but not the rest of the build directory including the suggested .map file and neither the (possibly broken?) sources that generated it. What I meant it looked like:
However, dumping the code with current toolchain & code:
(with only change being the
namespace { ... }surrounding the function, and looking at objdump it inlined the function into the one it is called from)And, there are some instances where the 'merging' seems to happen on strings like
F("FACTORY.RESET")e.g. settingsInitCommands() here uses it, and terminal function containsF("RESET"):asm code for the April build
_mqttInitCommands()is slightly different as well, but I am not sure what to look at there forSince then, I was not really been able to reproduce this issue (reliably, or even at all, and do not have some kind of small example that could showcase the issue), but I wonder if the 'merge' flag somehow messed with the pointers. Or it is something related to gcc / binutils / different order of .o files when linking / etc., and it was silently resolved due to updates.