aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/libbfd.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index 29ebd09..fe441c8 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -94,7 +94,7 @@ _bfd_dummy_core_file_matches_executable_p (ignore_core_bfd, ignore_exec_bfd)
bfd *ignore_core_bfd;
bfd *ignore_exec_bfd;
{
- bfd_error = invalid_operation;
+ bfd_set_error (bfd_error_invalid_operation);
return false;
}
@@ -132,10 +132,10 @@ char *
bfd_zmalloc (size)
bfd_size_type size;
{
- char *ptr = (char *) bfd_xmalloc (size);
+ char *ptr = (char *) malloc ((size_t) size);
- if (size != 0)
- memset(ptr,0, (size_t) size);
+ if (ptr && size)
+ memset(ptr, 0, (size_t) size);
return ptr;
}
@@ -162,6 +162,9 @@ real_read (where, a,b, file)
return fread(where, a,b,file);
}
+/* Return value is amount read (FIXME: how are errors and end of file dealt
+ with? We never call bfd_set_error, which is probably a mistake). */
+
bfd_size_type
bfd_read (ptr, size, nitems, abfd)
PTR ptr;
@@ -175,6 +178,22 @@ bfd_read (ptr, size, nitems, abfd)
if (nread > 0)
abfd->where += nread;
#endif
+
+ /* Set bfd_error if we did not read as much data as we expected.
+
+ If the read failed due to an error set the bfd_error_system_call,
+ else set bfd_error_file_truncated.
+
+ A BFD backend may wish to override bfd_error_file_truncated to
+ provide something more useful (eg. no_symbols or wrong_format). */
+ if (nread < (int)(size * nitems))
+ {
+ if (ferror (bfd_cache_lookup (abfd)))
+ bfd_set_error (bfd_error_system_call);
+ else
+ bfd_set_error (bfd_error_file_truncated);
+ }
+
return nread;
}
@@ -196,7 +215,7 @@ bfd_write (ptr, size, nitems, abfd)
if (nwrote >= 0)
errno = ENOSPC;
#endif
- bfd_error = system_call_error;
+ bfd_set_error (bfd_error_system_call);
}
return nwrote;
}
@@ -253,6 +272,9 @@ bfd_stat (abfd, statbuf)
return fstat (fileno(bfd_cache_lookup(abfd)), statbuf);
}
+/* Returns 0 for success, nonzero for failure (in which case bfd_get_error
+ can retrieve the error code). */
+
int
bfd_seek (abfd, position, direction)
bfd * CONST abfd;
@@ -317,7 +339,7 @@ bfd_seek (abfd, position, direction)
{
/* Force redetermination of `where' field. */
bfd_tell (abfd);
- bfd_error = system_call_error;
+ bfd_set_error (bfd_error_system_call);
}
else
{
@@ -359,7 +381,7 @@ bfd_add_to_string_table (table, new_string, table_length, free_ptr)
base = bfd_zmalloc ((bfd_size_type) space_length);
if (base == NULL) {
- bfd_error = no_memory;
+ bfd_set_error (bfd_error_no_memory);
return false;
}
}
@@ -371,7 +393,7 @@ bfd_add_to_string_table (table, new_string, table_length, free_ptr)
base = (char *) realloc (base, space_length);
if (base == NULL) {
- bfd_error = no_memory;
+ bfd_set_error (bfd_error_no_memory);
return false;
}
@@ -815,3 +837,14 @@ bfd_log2(x)
result++;
return result;
}
+
+boolean
+bfd_generic_is_local_label (abfd, sym)
+ bfd *abfd;
+ asymbol *sym;
+{
+ char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
+
+ return (sym->name[0] == locals_prefix);
+}
+