Merge "Link to the best relative relocations docs I know of."
diff --git a/libc/Android.bp b/libc/Android.bp
index 6442bc9..3b8507e 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -2272,6 +2272,10 @@
// libc dependencies for baremetal Rust projects.
// ========================================================
+// This library contains the following unresolved symbols:
+// __errno
+// abort
+// async_safe_fatal_va_list
cc_library_static {
name: "librust_baremetal",
header_libs: ["libc_headers"],
@@ -2283,6 +2287,17 @@
"-Wall",
"-Werror",
],
+ srcs: [
+ "bionic/fortify.cpp",
+ ],
+ arch: {
+ arm64: {
+ cflags: ["-DHAVE_ASSEMBLER___MEMCPY_CHK"],
+ srcs: [
+ "arch-arm64/string/__memcpy_chk.S",
+ ],
+ },
+ },
whole_static_libs: [
"libarm-optimized-routines-mem",
],
diff --git a/libc/include/execinfo.h b/libc/include/execinfo.h
index 347ae92..88f4ae7 100644
--- a/libc/include/execinfo.h
+++ b/libc/include/execinfo.h
@@ -47,7 +47,7 @@
*
* Available since API level 33.
*/
-int backtrace(void** buffer, int size) __INTRODUCED_IN(33);
+int backtrace(void* _Nonnull * _Nonnull buffer, int size) __INTRODUCED_IN(33);
/**
* [backtrace_symbols(3)](https://man7.org/linux/man-pages/man3/backtrace_symbols.3.html)
@@ -59,7 +59,7 @@
*
* Available since API level 33.
*/
-char** backtrace_symbols(void* const* buffer, int size) __INTRODUCED_IN(33);
+char* _Nullable * _Nullable backtrace_symbols(void* _Nonnull const* _Nonnull buffer, int size) __INTRODUCED_IN(33);
/**
* [backtrace_symbols_fd(3)](https://man7.org/linux/man-pages/man3/backtrace_symbols_fd.3.html)
@@ -69,6 +69,6 @@
*
* Available since API level 33.
*/
-void backtrace_symbols_fd(void* const* buffer, int size, int fd) __INTRODUCED_IN(33);
+void backtrace_symbols_fd(void* _Nonnull const* _Nonnull buffer, int size, int fd) __INTRODUCED_IN(33);
__END_DECLS
diff --git a/libc/include/termios.h b/libc/include/termios.h
index e3f388c..92ac24b 100644
--- a/libc/include/termios.h
+++ b/libc/include/termios.h
@@ -49,19 +49,19 @@
* [cfgetispeed(3)](http://man7.org/linux/man-pages/man3/cfgetispeed.3.html)
* returns the terminal input baud rate.
*/
-speed_t cfgetispeed(const struct termios* __t) __INTRODUCED_IN(21);
+speed_t cfgetispeed(const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
/**
* [cfgetospeed(3)](http://man7.org/linux/man-pages/man3/cfgetospeed.3.html)
* returns the terminal output baud rate.
*/
-speed_t cfgetospeed(const struct termios* __t) __INTRODUCED_IN(21);
+speed_t cfgetospeed(const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
/**
* [cfmakeraw(3)](http://man7.org/linux/man-pages/man3/cfmakeraw.3.html)
* configures the terminal for "raw" mode.
*/
-void cfmakeraw(struct termios* __t) __INTRODUCED_IN(21);
+void cfmakeraw(struct termios* _Nonnull __t) __INTRODUCED_IN(21);
/**
* [cfsetspeed(3)](http://man7.org/linux/man-pages/man3/cfsetspeed.3.html)
@@ -69,7 +69,7 @@
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
-int cfsetspeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetspeed(struct termios* _Nonnull __t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [cfsetispeed(3)](http://man7.org/linux/man-pages/man3/cfsetispeed.3.html)
@@ -77,7 +77,7 @@
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
-int cfsetispeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetispeed(struct termios* _Nonnull _t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [cfsetospeed(3)](http://man7.org/linux/man-pages/man3/cfsetospeed.3.html)
@@ -85,7 +85,7 @@
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
-int cfsetospeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
+int cfsetospeed(struct termios* _Nonnull __t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [tcdrain(3)](http://man7.org/linux/man-pages/man3/tcdrain.3.html)
@@ -120,7 +120,7 @@
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
-int tcgetattr(int __fd, struct termios* __t) __INTRODUCED_IN(21);
+int tcgetattr(int __fd, struct termios* _Nonnull __t) __INTRODUCED_IN(21);
/**
* [tcgetsid(3)](http://man7.org/linux/man-pages/man3/tcgetsid.3.html)
@@ -145,7 +145,7 @@
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
-int tcsetattr(int __fd, int __optional_actions, const struct termios* __t) __INTRODUCED_IN(21);
+int tcsetattr(int __fd, int __optional_actions, const struct termios* _Nonnull __t) __INTRODUCED_IN(21);
#endif
diff --git a/libc/malloc_debug/Config.cpp b/libc/malloc_debug/Config.cpp
index 6a81277..be577bc 100644
--- a/libc/malloc_debug/Config.cpp
+++ b/libc/malloc_debug/Config.cpp
@@ -87,35 +87,65 @@
{BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceSize},
},
{
+ "bt_sz",
+ {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceSize},
+ },
+ {
"backtrace_min_size",
{BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMinSize},
},
{
+ "bt_min_sz",
+ {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMinSize},
+ },
+ {
"backtrace_max_size",
{BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMaxSize},
},
-
+ {
+ "bt_max_sz",
+ {BACKTRACE_SPECIFIC_SIZES, &Config::SetBacktraceMaxSize},
+ },
{
"backtrace",
{BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
},
{
+ "bt",
+ {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
+ },
+ {
"backtrace_enable_on_signal",
{BACKTRACE | TRACK_ALLOCS, &Config::SetBacktraceEnableOnSignal},
},
-
+ {
+ "bt_en_on_sig",
+ {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktraceEnableOnSignal},
+ },
{
"backtrace_dump_on_exit",
{0, &Config::SetBacktraceDumpOnExit},
},
{
+ "bt_dmp_on_ex",
+ {0, &Config::SetBacktraceDumpOnExit},
+ },
+ {
"backtrace_dump_prefix",
{0, &Config::SetBacktraceDumpPrefix},
},
{
+ "bt_dmp_pre",
+ {0, &Config::SetBacktraceDumpPrefix},
+ },
+ {
"backtrace_full",
{BACKTRACE_FULL, &Config::VerifyValueEmpty},
},
+ {
+ "bt_full",
+ {BACKTRACE_FULL, &Config::VerifyValueEmpty},
+ },
{
"fill",
diff --git a/libc/malloc_debug/README.md b/libc/malloc_debug/README.md
index 3667624..fddc4a3 100644
--- a/libc/malloc_debug/README.md
+++ b/libc/malloc_debug/README.md
@@ -200,6 +200,20 @@
that is extra thorough and can unwind through Java frames. This will run
slower than the normal backtracing function.
+### bt, bt\_dmp\_on\_ex, bt\_dmp\_pre, bt\_en\_on\_sig, bt\_full, bt\_max\_sz, bt\_min\_sz, bt\_sz
+As of U, add shorter aliases for backtrace related options to avoid property length restrictions.
+
+| Alias | Option |
+|:----------------|:------------------------------|
+| bt | backtrace |
+| bt\_dmp\_on\_ex | backtrace\_dump\_on\_exit |
+| bt\_dmp\_pre | backtrace\_dump\_prefix |
+| bt\_en\_on\_sig | backtrace\_enable\_on\_signal |
+| bt\_full | backtrace\_full |
+| bt\_max\_sz | backtrace\_max\_size |
+| bt\_min\_sz | backtrace\_min\_size |
+| bt\_sz | backtrace\_size |
+
### check\_unreachable\_on\_signal
As of Android U, this option will trigger a check for unreachable memory
in a process. Specifically, if the signal SIGRTMAX - 16 (which is 48 on
diff --git a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
index 0a0eaef..bc7af6d 100644
--- a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
+++ b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
@@ -215,6 +215,13 @@
ASSERT_FALSE(config->backtrace_enable_on_signal());
ASSERT_FALSE(config->backtrace_dump_on_exit());
+ ASSERT_TRUE(InitConfig("bt=23")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+ ASSERT_EQ(23U, config->backtrace_frames());
+ ASSERT_TRUE(config->backtrace_enabled());
+ ASSERT_FALSE(config->backtrace_enable_on_signal());
+ ASSERT_FALSE(config->backtrace_dump_on_exit());
+
ASSERT_TRUE(InitConfig("backtrace")) << getFakeLogPrint();
ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
ASSERT_EQ(16U, config->backtrace_frames());
@@ -222,6 +229,13 @@
ASSERT_FALSE(config->backtrace_enable_on_signal());
ASSERT_FALSE(config->backtrace_dump_on_exit());
+ ASSERT_TRUE(InitConfig("bt")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+ ASSERT_EQ(16U, config->backtrace_frames());
+ ASSERT_TRUE(config->backtrace_enabled());
+ ASSERT_FALSE(config->backtrace_enable_on_signal());
+ ASSERT_FALSE(config->backtrace_dump_on_exit());
+
ASSERT_STREQ("", getFakeLogBuf().c_str());
ASSERT_STREQ("", getFakeLogPrint().c_str());
}
@@ -234,6 +248,13 @@
ASSERT_TRUE(config->backtrace_enable_on_signal());
ASSERT_FALSE(config->backtrace_dump_on_exit());
+ ASSERT_TRUE(InitConfig("bt_en_on_sig=64")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+ ASSERT_EQ(64U, config->backtrace_frames());
+ ASSERT_FALSE(config->backtrace_enabled());
+ ASSERT_TRUE(config->backtrace_enable_on_signal());
+ ASSERT_FALSE(config->backtrace_dump_on_exit());
+
ASSERT_TRUE(InitConfig("backtrace_enable_on_signal")) << getFakeLogPrint();
ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
ASSERT_EQ(16U, config->backtrace_frames());
@@ -241,6 +262,13 @@
ASSERT_TRUE(config->backtrace_enable_on_signal());
ASSERT_FALSE(config->backtrace_dump_on_exit());
+ ASSERT_TRUE(InitConfig("bt_en_on_sig")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options());
+ ASSERT_EQ(16U, config->backtrace_frames());
+ ASSERT_FALSE(config->backtrace_enabled());
+ ASSERT_TRUE(config->backtrace_enable_on_signal());
+ ASSERT_FALSE(config->backtrace_dump_on_exit());
+
ASSERT_STREQ("", getFakeLogBuf().c_str());
ASSERT_STREQ("", getFakeLogPrint().c_str());
}
@@ -288,6 +316,10 @@
ASSERT_EQ(0U, config->options());
ASSERT_TRUE(config->backtrace_dump_on_exit());
+ ASSERT_TRUE(InitConfig("bt_dmp_on_ex")) << getFakeLogPrint();
+ ASSERT_EQ(0U, config->options());
+ ASSERT_TRUE(config->backtrace_dump_on_exit());
+
ASSERT_STREQ("", getFakeLogBuf().c_str());
ASSERT_STREQ("", getFakeLogPrint().c_str());
}
@@ -307,10 +339,18 @@
ASSERT_EQ(0U, config->options());
ASSERT_EQ("/data/local/tmp/backtrace_heap", config->backtrace_dump_prefix());
+ ASSERT_TRUE(InitConfig("bt_dmp_pre")) << getFakeLogPrint();
+ ASSERT_EQ(0U, config->options());
+ ASSERT_EQ("/data/local/tmp/backtrace_heap", config->backtrace_dump_prefix());
+
ASSERT_TRUE(InitConfig("backtrace_dump_prefix=/fake/location")) << getFakeLogPrint();
ASSERT_EQ(0U, config->options());
ASSERT_EQ("/fake/location", config->backtrace_dump_prefix());
+ ASSERT_TRUE(InitConfig("bt_dmp_pre=/fake/location")) << getFakeLogPrint();
+ ASSERT_EQ(0U, config->options());
+ ASSERT_EQ("/fake/location", config->backtrace_dump_prefix());
+
ASSERT_STREQ("", getFakeLogBuf().c_str());
ASSERT_STREQ("", getFakeLogPrint().c_str());
}
@@ -319,6 +359,9 @@
ASSERT_TRUE(InitConfig("backtrace_full")) << getFakeLogPrint();
ASSERT_EQ(BACKTRACE_FULL, config->options());
+ ASSERT_TRUE(InitConfig("bt_full")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE_FULL, config->options());
+
ASSERT_STREQ("", getFakeLogBuf().c_str());
ASSERT_STREQ("", getFakeLogPrint().c_str());
}
@@ -786,6 +829,11 @@
ASSERT_EQ(37U, config->backtrace_min_size_bytes());
ASSERT_EQ(37U, config->backtrace_max_size_bytes());
+ ASSERT_TRUE(InitConfig("bt_sz=39")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+ ASSERT_EQ(39U, config->backtrace_min_size_bytes());
+ ASSERT_EQ(39U, config->backtrace_max_size_bytes());
+
ASSERT_FALSE(InitConfig("backtrace_size")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_size=0")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_size=-1")) << getFakeLogPrint();
@@ -808,6 +856,11 @@
ASSERT_EQ(9U, config->backtrace_min_size_bytes());
ASSERT_EQ(SIZE_MAX, config->backtrace_max_size_bytes());
+ ASSERT_TRUE(InitConfig("bt_min_sz=11")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+ ASSERT_EQ(11U, config->backtrace_min_size_bytes());
+ ASSERT_EQ(SIZE_MAX, config->backtrace_max_size_bytes());
+
ASSERT_FALSE(InitConfig("backtrace_min_size")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_min_size=0")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_min_size=-1")) << getFakeLogPrint();
@@ -830,6 +883,11 @@
ASSERT_EQ(0U, config->backtrace_min_size_bytes());
ASSERT_EQ(13U, config->backtrace_max_size_bytes());
+ ASSERT_TRUE(InitConfig("bt_max_sz=15")) << getFakeLogPrint();
+ ASSERT_EQ(BACKTRACE_SPECIFIC_SIZES, config->options());
+ ASSERT_EQ(0U, config->backtrace_min_size_bytes());
+ ASSERT_EQ(15U, config->backtrace_max_size_bytes());
+
ASSERT_FALSE(InitConfig("backtrace_max_size")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_max_size=0")) << getFakeLogPrint();
ASSERT_FALSE(InitConfig("backtrace_max_size=-1")) << getFakeLogPrint();
diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp
index 3cc5bbd..e90a824 100644
--- a/tests/malloc_test.cpp
+++ b/tests/malloc_test.cpp
@@ -661,13 +661,13 @@
}
TEST(malloc, mallopt_smoke) {
-#if !defined(ANDROID_HOST_MUSL)
+#if defined(__BIONIC__)
errno = 0;
ASSERT_EQ(0, mallopt(-1000, 1));
// mallopt doesn't set errno.
ASSERT_EQ(0, errno);
#else
- GTEST_SKIP() << "musl doesn't have mallopt";
+ GTEST_SKIP() << "bionic-only test";
#endif
}