diff -u -r ../elfutils-0.166/src/ldgeneric.c ./src/ldgeneric.c --- ../elfutils-0.166/src/ldgeneric.c 2015-08-21 08:22:37.000000000 -0400 +++ ./src/ldgeneric.c 2016-05-04 15:20:09.029651147 -0400 @@ -1747,7 +1747,13 @@ /* The content of the file is available in memory. Read the memory region as a stream. */ +#ifdef __ANDROID__ + ldin = tmpfile(); + fwrite(content, 1, contentsize, ldin); + rewind(ldin); +#else ldin = fmemopen (content, contentsize, "r"); +#endif } /* No need for locking. */ @@ -2631,9 +2637,9 @@ /* Callback function registered with on_exit to make sure the temporary files gets removed if something goes wrong. */ static void -remove_tempfile (int status, void *arg) +remove_tempfile () { - if (status != 0 && ld_state.tempfname != NULL) + if (ld_state.tempfname != NULL) unlink (ld_state.tempfname); } @@ -2680,7 +2686,7 @@ /* Make sure we remove the temporary file in case something goes wrong. */ - on_exit (remove_tempfile, NULL); + atexit (remove_tempfile); /* Create the ELF file data for the output file. */ Elf *elf = ld_state.outelf = elf_begin (fd, @@ -3352,6 +3358,7 @@ struct id_list search; struct id_list *verp; bool result = ld_state.default_bind_local; + size_t substr_len; if (XELF_ST_BIND (sym->st_info) == STB_LOCAL || sym->st_shndx == SHN_UNDEF) /* We don't have to do anything to local symbols here. */ @@ -3367,7 +3374,12 @@ version = strchr (str, VER_CHR); if (version != NULL) { - search.id = strndupa (str, version - str); + substr_len = version - str; + char* tmp = alloca(substr_len+1); + strncpy(tmp, str, substr_len); + tmp[substr_len] = 0; + search.id = tmp; + if (*++version == VER_CHR) /* Skip the second '@' signaling a default definition. */ ++version;