Thread View: gnu.gcc.bug
1 messages
1 total messages
Started by Luke Kendall
Mon, 08 Jan 1996 00:00
bfd assertion fail elf32-i386.c:624
Author: Luke Kendall
Date: Mon, 08 Jan 1996 00:00
Date: Mon, 08 Jan 1996 00:00
185 lines
5547 bytes
5547 bytes
I believe this is a bug in gcc under Linux. Anyone know whether it's
known or not?
System:
Linux genius 1.2.13 #12 Sun Jan 7 08:22:37 EST 1996 i486
libc:
libc.so.5 => /lib/libc.so.5.0.9
gcc:
Reading specs from /usr/lib/gcc-lib/i486-linuxelf/2.6.3/specs
gcc version 2.6.3
BTW, it used to compile under pre-ELF gcc. It's a very old program.
DESCRIPTION
-----------
Assertion failure in gcc for simple program.
$ cc -Wall cpiosplit.c
bfd assertion fail elf32-i386.c:624
(I've since realised that the code should be using lstat() instead
of stat(), but I don't believe that's relevant.)
See `Note 1', below, for some more details.
See `Note 2' for the source code (about 120 lines) to cpiosplit.c.
Note 1
------
Looking inside /system_cd/devel/binutils-2.5.2l.17/bfd/elf32-i386.c.gz
I see:
/* Make sure we know what is going on here. */
BFD_ASSERT (dynobj != NULL
&& ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
|| ((h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC) != 0
&& (h->elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR) != 0
&& (h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR) == 0
&& (elf_elfheader (h->root.u.def.section->owner)->e_type
== ET_DYN)
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& (bfd_get_flavour (h->root.u.def.section->owner)
== bfd_target_elf_flavour)
&& h->root.u.def.section->output_section == NULL)));
which I must confess, doesn't mean a whole lot to me. I think this is in
the code generation phase, however, or even the linking stage.
Note 2
------
Source code for cpiosplit.c:
/*
* Read filenames from standard input and split them into sub lists
* so that a cpio -c of each sub list will be less than the number of
* bytes specified by a list of sizes.
*
* The lists are placed in files starting with the lists-basename argument
* with '.00', '.01', '.02' ... appended to them.
*
* The sizes are given by the remaining arguments. They are used cyclically.
*
* Author: Tim Long
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#define CPIO_HDRZ 80
char *myname;
char *basename;
long *sizes;
int nsizes;
int this_size;
int this_list;
long bytes_so_far;
void
usage(void)
{
fprintf(stderr, "usage: %s lists-basename media-size...\n", myname);
}
int
main(int argc, char **argv)
{
register int i;
char *ptr;
char fname[1024];
char list_name[512];
register FILE *list_stream;
myname = argv[0];
if (argc < 3)
usage();
basename = argv[1];
nsizes = argc - 2;
if ((sizes = (long *)malloc(nsizes * sizeof sizes[0])) == NULL)
{
fprintf(stderr, "%s: Ran out of memory.\n", myname);
exit(1);
}
for (i = 2; i < argc; i++)
{
sizes[i - 2] = strtol(argv[i], &ptr, 0);
if (*ptr != '\0')
usage();
}
sprintf(list_name, "%s.%02d", basename, this_list);
if ((list_stream = fopen(list_name, "w")) == NULL)
{
fprintf(stderr, "%s: Could not create %s.\n", myname, list_name);
exit(1);
}
bytes_so_far = CPIO_HDRZ;
while (gets(fname) != NULL)
{
struct stat statb;
long fsize;
long cost;
if (stat(fname, &statb) != 0)
{
fprintf
(
stderr, "%s: Warning; could not stat %s. Elided from list.\n",
myname, fname
);
continue;
}
if ((statb.st_mode & S_IFMT) == S_IFREG)
fsize = statb.st_size;
else
fsize = 0;
cost = fsize + strlen(fname) + 1 + CPIO_HDRZ;
if (bytes_so_far + cost >= sizes[this_size])
{
/*
fprintf(stderr, "bytes_so_far = %ld, cost = %ld, sizes[%d] = %ld\n",
bytes_so_far, cost, this_size, sizes[this_size]);
*/
fclose(list_stream);
this_list++;
if (++this_size >= nsizes)
this_size = 0;
sprintf(list_name, "%s.%02d", basename, this_list);
if ((list_stream = fopen(list_name, "w")) == NULL)
{
fprintf
(
stderr, "%s: Could not create %s.\n", myname, list_name
);
exit(1);
}
bytes_so_far = CPIO_HDRZ;
}
fprintf(list_stream, "%s\n", fname);
bytes_so_far += cost;
if (bytes_so_far > sizes[this_size])
{
fprintf
(
stderr,
"%s: Warning; %s has only one file but is still too big.\n",
myname, list_name
);
}
}
fclose(list_stream);
return 0;
}
--
Luke Kendall, Senior Software Engineer. | Net: luke@research.canon.com.au
Canon Information Systems Research Australia | Phone: +61 2 805 2982
P.O. Box 313 North Ryde, NSW, Australia 2113 | Fax: +61 2 805 2929
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads