linker: Make the errors reported by dlopen/dlsym be more useful.
Changed it so that when the linker generates error messages, they are scribbled away into a buffer that dlfcn and friends can read from. Since the error messages are generetad with snprintf, and snprintf MAY call malloc during some code paths, we now link against a version of libc that does not contain malloc/free/realloc/calloc. We then define malloc and friends in the dynamic loader, and make them abort() if they are ever called. Signed-off-by: Dima Zavin <dima@android.com>
This commit is contained in:
@@ -55,17 +55,16 @@
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
|
||||
#define __PRINTVF(v,f,x...) do { \
|
||||
(debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
|
||||
} while (0)
|
||||
/* Only use printf() during debugging. We have seen occasional memory
|
||||
* corruption when the linker uses printf().
|
||||
*/
|
||||
#if LINKER_DEBUG
|
||||
extern int debug_verbosity;
|
||||
#warning "*** LINKER IS USING printf(); DO NOT CHECK THIS IN ***"
|
||||
#define _PRINTVF(v,f,x...) __PRINTVF(v,f,x)
|
||||
#define _PRINTVF(v,f,x...) \
|
||||
do { \
|
||||
(debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
|
||||
} while (0)
|
||||
#else /* !LINKER_DEBUG */
|
||||
#define _PRINTVF(v,f,x...) do {} while(0)
|
||||
#endif /* LINKER_DEBUG */
|
||||
@@ -75,8 +74,9 @@ extern int debug_verbosity;
|
||||
#define TRACE(x...) _PRINTVF(1, TRUE, x)
|
||||
#define WARN(fmt,args...) \
|
||||
_PRINTVF(-1, TRUE, "%s:%d| WARNING: " fmt, __FILE__, __LINE__, ## args)
|
||||
#define ERROR(fmt,args...) \
|
||||
__PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
||||
#define ERROR(fmt,args...) \
|
||||
_PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
||||
|
||||
|
||||
#if TRACE_DEBUG
|
||||
#define DEBUG(x...) _PRINTVF(2, TRUE, "DEBUG: " x)
|
||||
|
Reference in New Issue
Block a user