return err;
 }
 
-static char *dso__read_build_id(struct dso *self)
-{
-       int len;
-       char *build_id = NULL;
-       unsigned char rawbf[BUILD_ID_SIZE];
-
-       len = filename__read_build_id(self->long_name, rawbf, sizeof(rawbf));
-       if (len < 0)
-               goto out;
-
-       build_id = malloc(len * 2 + 1);
-       if (build_id == NULL)
-               goto out;
-
-       build_id__sprintf(rawbf, len, build_id);
-out:
-       return build_id;
-}
-
 char dso__symtab_origin(const struct dso *self)
 {
        static const char origin[] = {
 int dso__load(struct dso *self, struct map *map, symbol_filter_t filter)
 {
        int size = PATH_MAX;
-       char *name = malloc(size), *build_id = NULL;
+       char *name = malloc(size);
+       u8 build_id[BUILD_ID_SIZE];
        int ret = -1;
        int fd;
 
 
 more:
        do {
-               int berr = 0;
-
                self->origin++;
                switch (self->origin) {
                case DSO__ORIG_FEDORA:
                                 self->long_name);
                        break;
                case DSO__ORIG_BUILDID:
-                       build_id = dso__read_build_id(self);
-                       if (build_id != NULL) {
+                       if (filename__read_build_id(self->long_name, build_id,
+                                                   sizeof(build_id))) {
+                               char build_id_hex[BUILD_ID_SIZE * 2 + 1];
+
+                               build_id__sprintf(build_id, sizeof(build_id),
+                                                 build_id_hex);
                                snprintf(name, size,
                                         "/usr/lib/debug/.build-id/%.2s/%s.debug",
-                                       build_id, build_id + 2);
-                               goto compare_build_id;
+                                       build_id_hex, build_id_hex + 2);
+                               if (self->has_build_id)
+                                       goto compare_build_id;
+                               break;
                        }
                        self->origin++;
                        /* Fall thru */
                }
 
                if (self->has_build_id) {
-                       bool match;
-                       build_id = malloc(BUILD_ID_SIZE);
-                       if (build_id == NULL)
+                       if (filename__read_build_id(name, build_id,
+                                                   sizeof(build_id)) < 0)
                                goto more;
-                       berr = filename__read_build_id(name, build_id,
-                                                      BUILD_ID_SIZE);
 compare_build_id:
-                       match = berr > 0 && memcmp(build_id, self->build_id,
-                                                  sizeof(self->build_id)) == 0;
-                       free(build_id);
-                       build_id = NULL;
-                       if (!match)
+                       if (memcmp(build_id, self->build_id,
+                                  sizeof(self->build_id)) != 0)
                                goto more;
                }