Merge branch 'bugfix/make_system_using_rom_time_funcs' into 'master'

esp_rom: Fix esp32.rom.newlib-time.ld should includes all time ROM functions/data

Closes IDFGH-2868

See merge request espressif/esp-idf!8008
pull/5052/head
Angus Gratton 2020-03-27 15:43:38 +08:00
commit f68dbd77e9
6 zmienionych plików z 36 dodań i 10 usunięć

Wyświetl plik

@ -32,7 +32,7 @@ else() # Regular app build
# If SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS option is defined # If SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS option is defined
# then all time functions from the ROM memory will not be linked. # then all time functions from the ROM memory will not be linked.
# Instead, those functions can be used from the toolchain by ESP-IDF. # Instead, those functions can be used from the toolchain by ESP-IDF.
target_linker_script(${COMPONENT_LIB} INTERFACE "esp32/ld/esp32.rom.newlib-funcs-time.ld") target_linker_script(${COMPONENT_LIB} INTERFACE "esp32/ld/esp32.rom.newlib-time.ld")
endif() endif()
# Include in newlib nano from ROM only if SPIRAM cache workaround is disabled # Include in newlib nano from ROM only if SPIRAM cache workaround is disabled

Wyświetl plik

@ -26,6 +26,13 @@ ifndef CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
LINKER_SCRIPTS += esp32.rom.spiflash.ld LINKER_SCRIPTS += esp32.rom.spiflash.ld
endif endif
ifndef CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS
# If SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS option is defined
# then all time functions from the ROM memory will not be linked.
# Instead, those functions can be used from the toolchain by ESP-IDF.
LINKER_SCRIPTS += esp32.rom.newlib-time.ld
endif
COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/esp32/ld \ COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/esp32/ld \
$(addprefix -T ,$(LINKER_SCRIPTS)) \ $(addprefix -T ,$(LINKER_SCRIPTS)) \

Wyświetl plik

@ -10,14 +10,10 @@
_ctype_ = 0x3ff96354; _ctype_ = 0x3ff96354;
__ctype_ptr__ = 0x3ff96350; __ctype_ptr__ = 0x3ff96350;
_daylight = 0x3ffae0a4;
environ = 0x3ffae0b4; environ = 0x3ffae0b4;
_global_impure_ptr = 0x3ffae0b0; _global_impure_ptr = 0x3ffae0b0;
__mb_cur_max = 0x3ff96530; __mb_cur_max = 0x3ff96530;
__month_lengths = 0x3ff9609c;
__sf_fake_stderr = 0x3ff96458; __sf_fake_stderr = 0x3ff96458;
__sf_fake_stdin = 0x3ff96498; __sf_fake_stdin = 0x3ff96498;
__sf_fake_stdout = 0x3ff96478; __sf_fake_stdout = 0x3ff96478;
_timezone = 0x3ffae0a0;
_tzname = 0x3ffae030;
__wctomb = 0x3ff96540; __wctomb = 0x3ff96540;

Wyświetl plik

@ -9,7 +9,7 @@
which declares strong symbols. This is done so that ROM functions are always which declares strong symbols. This is done so that ROM functions are always
used instead of the ones provided by libc.a. used instead of the ones provided by libc.a.
Time functions were moved to the esp32.rom.newlib-funcs-time.ld file. Time functions were moved to the esp32.rom.newlib-time.ld file.
*/ */
abs = 0x40056340; abs = 0x40056340;
@ -126,9 +126,6 @@ __swsetup_r = 0x40058cc8;
toascii = 0x4000c720; toascii = 0x4000c720;
tolower = 0x40001868; tolower = 0x40001868;
toupper = 0x40001884; toupper = 0x40001884;
__tzcalc_limits = 0x400018a0;
__tz_lock = 0x40001a04;
__tz_unlock = 0x40001a10;
ungetc = 0x400590f4; ungetc = 0x400590f4;
_ungetc_r = 0x40058fa0; _ungetc_r = 0x40058fa0;
__utoa = 0x400561f0; __utoa = 0x400561f0;

Wyświetl plik

@ -1,4 +1,4 @@
/* These are the newlib functions present in ESP32 ROM. /* These are the newlib functions and the .bss/.data symbols necessary for these functions present in ESP32 ROM.
They should not be used when you need to solve the Y2K38 problem. They should not be used when you need to solve the Y2K38 problem.
Because these functions were compiled with 32-bit width for the time_t structure. Because these functions were compiled with 32-bit width for the time_t structure.
*/ */
@ -19,3 +19,11 @@ time = 0x40001844;
__time_load_locale = 0x4000183c; __time_load_locale = 0x4000183c;
tzset = 0x40001a1c; tzset = 0x40001a1c;
_tzset_r = 0x40001a28; _tzset_r = 0x40001a28;
__tzcalc_limits = 0x400018a0;
__tz_lock = 0x40001a04;
__tz_unlock = 0x40001a10;
/* The .bss/.data symbols necessary for these functions */
_timezone = 0x3ffae0a0;
_tzname = 0x3ffae030;
_daylight = 0x3ffae0a4;
__month_lengths = 0x3ff9609c;

Wyświetl plik

@ -193,3 +193,21 @@ TEST_CASE("newlib: can link 'system', 'raise'", "[newlib]")
{ {
printf("system: %p, raise: %p\n", &system, &raise); printf("system: %p, raise: %p\n", &system, &raise);
} }
TEST_CASE("newlib: rom and toolchain localtime func gives the same result", "[newlib]")
{
// This UNIX time represents 2020-03-12 15:00:00 EDT (19:00 GMT)
// as can be verified with 'date --date @1584039600'
const time_t seconds = 1584039600;
setenv("TZ", "EST5EDT,M3.2.0,M11.1.0", 1); // America/New_York
tzset();
struct tm *tm = localtime(&seconds);
tm->tm_isdst = 1;
static char buf[32];
strftime(buf, sizeof(buf), "%F %T %Z", tm);
static char test_result[64];
sprintf(test_result, "%s (tm_isdst = %d)", buf, tm->tm_isdst);
printf("%s\n", test_result);
TEST_ASSERT_EQUAL_STRING("2020-03-12 15:00:00 EDT (tm_isdst = 1)", test_result);
}