Hi,
I have downloaded grub 2 from cvs and tried to compile it on my system which is a debian woody with gcc version 2.95.4
It is written in the INSTALL file that the required version is * GCC 2.95 or later.
It didn't work for 3 reasons:
1) unnamed union 2) declaration not at the beginning of a block 3) undefined symbol (memset)
Although I don't know if you are interrested in that or not, I'm sending some modifications about these three items that allows grub 2 to be compiled with 2.95.4 (at least on my system).
I'm not used to send patches so I might be doing something wrong, please tell me if it is the case.
diff -ru grub2/fs/ext2.c grub2-mod/fs/ext2.c --- grub2/fs/ext2.c Mon Dec 13 18:26:17 2004 +++ grub2-mod/fs/ext2.c Wed Mar 2 14:17:36 2005 @@ -136,7 +136,9 @@ grub_uint32_t tripple_indir_block; } blocks; char symlink[60]; - }; + } osd1_union; +#define ext2_blocks osd1_union.blocks +#define ext2_symlink osd1_union.symlink grub_uint32_t version; grub_uint32_t acl; grub_uint32_t dir_acl; @@ -199,14 +201,14 @@
/* Direct blocks. */ if (fileblock < INDIRECT_BLOCKS) - blknr = grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]); + blknr = grub_le_to_cpu32 (inode->ext2_blocks.dir_blocks[fileblock]); /* Indirect. */ else if (fileblock < INDIRECT_BLOCKS + blksz / 4) { grub_uint32_t indir[blksz / 4];
if (grub_disk_read (data->disk, - grub_le_to_cpu32 (inode->blocks.indir_block) + grub_le_to_cpu32 (inode->ext2_blocks.indir_block) << log2_blksz, 0, blksz, (char *) indir)) return grub_errno; @@ -222,7 +224,7 @@ grub_uint32_t indir[blksz / 4];
if (grub_disk_read (data->disk, - grub_le_to_cpu32 (inode->blocks.double_indir_block) + grub_le_to_cpu32 (inode->ext2_blocks.double_indir_block) << log2_blksz, 0, blksz, (char *) indir)) return grub_errno; @@ -361,7 +363,7 @@ otherwise it is stored in the inode. */ if (grub_le_to_cpu32 (diro->inode.size) <= 60) grub_strncpy (symlink, - diro->inode.symlink, + diro->inode.ext2_symlink, grub_le_to_cpu32 (diro->inode.size)); else { @@ -548,7 +550,7 @@ grub_ext2_dir (grub_device_t device, const char *path, int (*hook) (const char *filename, int dir)) { - struct grub_ext2_data *data = 0;; + struct grub_ext2_data *data = 0; struct grub_fshelp_node *fdiro = 0;
auto int NESTED_FUNC_ATTR iterate (const char *filename,
diff -ru grub2/fs/hfs.c grub2-mod/fs/hfs.c
--- grub2/fs/hfs.c Mon Nov 1 17:14:16 2004
+++ grub2-mod/fs/hfs.c Tue Mar 1 16:46:02 2005
@@ -480,6 +480,7 @@
/* Iterate over all records in this node. */
for (i = 0; i < grub_be_to_cpu16 (node.node.reccnt); i++)
{
+ struct grub_hfs_record rec;
int pos = (nodesize >> 1) - 1 - i;
struct pointer
{
@@ -489,14 +490,10 @@
pnt = (struct pointer *) (grub_be_to_cpu16 (node.offsets[pos])
+ node.rawnode);
- struct grub_hfs_record rec =
- {
- &pnt->key,
- pnt->keylen,
- &pnt->key + pnt->keylen +(pnt->keylen + 1) % 2,
- nodesize - grub_be_to_cpu16 (node.offsets[pos])
- - pnt->keylen - 1
- };
+ rec.key = &pnt->key;
+ rec.keylen = pnt->keylen;
+ rec.data = &pnt->key + pnt->keylen +(pnt->keylen + 1) % 2;
+ rec.datalen = nodesize - grub_be_to_cpu16 (node.offsets[pos]) - pnt->keylen - 1;
if (node_hook (&node.node, &rec))
return 0;
@@ -590,8 +587,8 @@
struct grub_hfs_catalog_key key = {0, grub_cpu_to_be32 (dir), 0, ""};
auto int node_found (struct grub_hfs_node *, struct grub_hfs_record *); - auto int it_dir (struct grub_hfs_node * __attribute ((unused)), - struct grub_hfs_record *); + //auto int it_dir (struct grub_hfs_node * __attribute ((unused)), + auto int it_dir (struct grub_hfs_node * ,struct grub_hfs_record *);
int node_found (struct grub_hfs_node *hnd, struct grub_hfs_record *rec) @@ -658,6 +655,7 @@ char *origpath; struct grub_hfs_filerec frec; struct grub_hfs_dirrec *dir = (struct grub_hfs_dirrec *) &frec; + struct grub_hfs_catalog_key key; frec.type = GRUB_HFS_FILETYPE_DIR;
if (path[0] != '/') @@ -689,7 +687,6 @@ next++; }
- struct grub_hfs_catalog_key key;
key.parent_dir = grub_cpu_to_be32 (inode); key.strlen = grub_strlen (path); diff -ru grub2/fs/iso9660.c grub2-mod/fs/iso9660.c --- grub2/fs/iso9660.c Mon Nov 1 17:14:16 2004 +++ grub2-mod/fs/iso9660.c Tue Mar 1 16:48:19 2005 @@ -509,7 +509,7 @@ int nameoffset = offset + sizeof (dirent); struct grub_fshelp_node *node; int sua_off = (sizeof (dirent) + dirent.namelen + 1 - - (dirent.namelen % 2));; + - (dirent.namelen % 2)); int sua_size = dirent.len - sua_off; sua_off += offset + dir->data->susp_skip; diff -ru grub2/fs/jfs.c grub2-mod/fs/jfs.c --- grub2/fs/jfs.c Mon Nov 1 17:14:16 2004 +++ grub2-mod/fs/jfs.c Wed Mar 2 14:26:50 2005 @@ -194,7 +194,10 @@ grub_uint8_t unused[32]; grub_uint8_t path[128]; } symlink; - } __attribute__ ((packed)); + } jfs_union __attribute__ ((packed)); +#define jfs_file jfs_union.file +#define jfs_dir jfs_union.dir +#define jfs_symlink jfs_union.symlink } __attribute__ ((packed));
struct grub_jfs_data @@ -289,7 +292,7 @@ return -1; }
- return getblk (&inode->file.tree, &inode->file.extents[0]); + return getblk (&inode->jfs_file.tree, &inode->jfs_file.extents[0]); }
@@ -376,7 +379,7 @@ struct grub_jfs_diropen *diro; int blk;
- de = (struct grub_jfs_internal_dirent *) inode->dir.dirents; + de = (struct grub_jfs_internal_dirent *) inode->jfs_dir.dirents;
if (!((grub_le_to_cpu32 (inode->mode) & GRUB_JFS_FILETYPE_MASK) == GRUB_JFS_FILETYPE_DIR)) @@ -394,12 +397,12 @@ diro->inode = inode;
/* Check if the entire tree is contained within the inode. */ - if (inode->file.tree.flags & GRUB_JFS_TREE_LEAF) + if (inode->jfs_file.tree.flags & GRUB_JFS_TREE_LEAF) { - diro->leaf = inode->dir.dirents; + diro->leaf = inode->jfs_dir.dirents; diro->next_leaf = (struct grub_jfs_leaf_next_dirent *) de; - diro->sorted = inode->dir.header.sorted; - diro->count = inode->dir.header.count; + diro->sorted = inode->jfs_dir.header.sorted; + diro->count = inode->jfs_dir.header.count; diro->dirpage = 0;
return diro; @@ -412,7 +415,7 @@ return 0; }
- blk = grub_le_to_cpu32 (de[inode->dir.header.sorted[0]].ex.blk2);
+ blk = grub_le_to_cpu32 (de[inode->jfs_dir.header.sorted[0]].ex.blk2);
blk <<= (grub_le_to_cpu16 (data->sblock.log2_blksz) - GRUB_DISK_SECTOR_BITS);
/* Read in the nodes until we are on the leaf node level. */ @@ -481,7 +484,7 @@
/* If the inode contains the entrie tree or if this was the last node, there is nothing to read. */ - if ((diro->inode->file.tree.flags & GRUB_JFS_TREE_LEAF) + if ((diro->inode->jfs_file.tree.flags & GRUB_JFS_TREE_LEAF) || !grub_le_to_cpu64 (diro->dirpage->header.nextb)) return GRUB_ERR_OUT_OF_RANGE;
@@ -703,7 +706,7 @@
return grub_error (GRUB_ERR_SYMLINK_LOOP, "too deep nesting of symlinks");
if (size <= 128) - grub_strncpy (symlink, data->currinode.symlink.path, 128); + grub_strncpy (symlink, data->currinode.jfs_symlink.path, 128); else if (grub_jfs_read_file (data, 0, 0, size, symlink) < 0) return grub_errno;
diff -ru grub2/fs/minix.c grub2-mod/fs/minix.c --- grub2/fs/minix.c Fri Jan 21 23:34:18 2005 +++ grub2-mod/fs/minix.c Tue Mar 1 16:35:38 2005 @@ -252,7 +252,7 @@ struct grub_minix_sblock *sblock = &data->sblock;
/* Block in which the inode is stored. */ - int block; + int block,offs; data->ino = ino;
/* The first inode in minix is inode 1. */
@@ -265,7 +265,7 @@
if (data->version == 1)
{
block += ino / (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix_inode));
- int offs = (ino % (GRUB_DISK_SECTOR_SIZE
+ offs = (ino % (GRUB_DISK_SECTOR_SIZE
/ sizeof (struct grub_minix_inode))
* sizeof (struct grub_minix_inode));
@@ -276,7 +276,7 @@ { block += ino / (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix2_inode)); - int offs = (ino + offs = (ino % (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix2_inode)) * sizeof (struct grub_minix2_inode));
diff -ru grub2/fs/ufs.c grub2-mod/fs/ufs.c --- grub2/fs/ufs.c Mon Nov 1 17:14:16 2004 +++ grub2-mod/fs/ufs.c Wed Mar 2 15:05:50 2005 @@ -45,17 +45,17 @@ #define UFS_BLKSZ(sblock) (grub_le_to_cpu32 (sblock->bsize))
#define INODE(data,field) (data->ufs_type == UFS1 ? \
- data->inode. field : data->inode2. field)
+ data->ufs_inode.ufs_inode_union. field : data->ufs_inode2.ufs_inode_union. field)
#define INODE_ENDIAN(data,field,bits1,bits2) (data->ufs_type == UFS1 ? \
- grub_le_to_cpu##bits1 (data->inode.field) : \
- grub_le_to_cpu##bits2 (data->inode2.field))
+ grub_le_to_cpu##bits1 (data->ufs_inode.field) : \
+ grub_le_to_cpu##bits2 (data->ufs_inode2.field))
#define INODE_SIZE(data) INODE_ENDIAN (data,size,32,64)
#define INODE_MODE(data) INODE_ENDIAN (data,mode,16,16)
#define INODE_BLKSZ(data) (data->ufs_type == UFS1 ? 32 : 64)
#define INODE_DIRBLOCKS(data,blk) INODE_ENDIAN \
- (data,blocks.dir_blocks[blk],32,64)
+ (data,ufs_inode_union.blocks.dir_blocks[blk],32,64)
#define INODE_INDIRBLOCKS(data,blk) INODE_ENDIAN \
- (data,blocks.indir_blocks[blk],32,64)
+ (data,ufs_inode_union.blocks.indir_blocks[blk],32,64)
/* The blocks on which the superblock can be found. */ static int sblocklist[] = { 128, 16, 0, 512, -1 }; @@ -112,7 +112,7 @@ grub_uint32_t indir_blocks[GRUB_UFS_INDIRBLKS]; } blocks; grub_uint8_t symlink[(GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS) * 4]; - }; + } ufs_inode_union; grub_uint32_t flags; grub_uint32_t nblocks; grub_uint32_t gen; @@ -151,7 +151,7 @@ grub_uint64_t indir_blocks[GRUB_UFS_INDIRBLKS]; } blocks; grub_uint8_t symlink[(GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS) * 8]; - }; + } ufs_inode_union;
grub_uint8_t unused[24]; }; @@ -174,7 +174,9 @@ { struct grub_ufs_inode inode; struct grub_ufs2_inode inode2; - }; + } ufs_data_union ; +#define ufs_inode ufs_data_union.inode +#define ufs_inode2 ufs_data_union.inode2 enum { UFS1, @@ -323,7 +325,7 @@
if (data->ufs_type == UFS1) { - struct grub_ufs_inode *inode = &data->inode; + struct grub_ufs_inode *inode = &data->ufs_inode;
grub_disk_read (data->disk, (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk) @@ -335,7 +337,7 @@ } else { - struct grub_ufs2_inode *inode = &data->inode2; + struct grub_ufs2_inode *inode = &data->ufs_inode2;
grub_disk_read (data->disk, (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk) diff -ru grub2/include/grub/misc.h grub2-mod/include/grub/misc.h --- grub2/include/grub/misc.h Sat Jan 29 23:01:53 2005 +++ grub2-mod/include/grub/misc.h Wed Mar 2 11:38:21 2005 @@ -35,6 +35,7 @@ char *EXPORT_FUNC(grub_stpcpy) (char *dest, const char *src); char *EXPORT_FUNC(grub_strcat) (char *dest, const char *src); char *EXPORT_FUNC(grub_strncat) (char *dest, const char *src, int c); +void *EXPORT_FUNC(memset) (void *s, int c, grub_size_t n);
/* Prototypes for aliases. */ void *EXPORT_FUNC(memmove) (void *dest, const void *src, grub_size_t n);
-- Vincent Guffens PhD Student UCL/CESAME tel: +32 10 47 80 30 Value your freedom, or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. -- Richard M. Stallman
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel