Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает.
Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает. К нему по прежнему можно обратиться и вывести значения xy. При этом по завершению работы программы, в консоль выводится "destruct" второй раз.
как правильно уничтожить объект?
--build - платформа где будут собираться исходники какой либо программы
--host - указываем где будет запускаться скомпиленная программа
--target - а это как я понимаю используется чтобы указать где будет собираться сам GCC?
Я их собрал с опцией (это верно в моем случае?):
HOST=x86_64-pc-nto-qnx6.5.0
Но не просто собрать, а собрать так, чтобы собранный компилятор компилировал исходники под QNX.
При компиляции выдает ошибку
struct SYM* buildTree(struct SYM *psym[], int N) ... void division(struct alphabet *alphabetLetter, int groupCount) { int psysms[256]; ... psysms[i] = &alphabetLetter[i]; ... struct SYM *root = buildTree(psysms, alphabetLen); ... }
.file "main.c"
Зачем в коде название файла с исходным кодом
.ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
...и версия моей убунты?
Попадают ли они в исполняемый файл при окончательно компиляции и зачем используются?
$ readelf -a hello | grep FILE
28: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.c
38: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
41: 0000000000000000 0 FILE LOCAL DEFAULT ABS
.comment
объектного файла, а оттуда -- в исполняемый файл:$ objdump -s -j .comment hello
hello: file format elf64-x86-64
Contents of section .comment:
0000 4743433a 20284465 6269616e 20362e33 GCC: (Debian 6.3
0010 2e302d31 382b6465 62397531 2920362e .0-18+deb9u1) 6.
0020 332e3020 32303137 30353136 00 3.0 20170516.
Какой тулчейн можно использовать для написания простейшего загрузчика на asm и С++
e.data.fd = cfd; e.data.ptr = (void*)cfd;
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
в документации сказано, что там должен быть дескриптор серверного сокета
получается mainx узнает о том что есть функция printx() на этапе линковки [mainx.o] и [printx.o]?
Каким образом происходит передача информации в [mainx] что функция printx() существует?
objdump -dr mainx.o
...
0000000000000000 <main>:
0: 55 push %rbp
...
3a: 89 c7 mov %eax,%edi
3c: e8 00 00 00 00 callq 41 <main+0x41>
3d: R_X86_64_PLT32 _Z6printxi-0x4
41: b8 00 00 00 00 mov $0x0,%eax
46: c9 leaveq
47: c3 retq
...
readelf -a mainx.o
...
Relocation section '.rela.text' at offset 0x580 contains 12 entries:
Offset Info Type Sym. Value Sym. Name + Addend
...
00000000003d 001400000004 R_X86_64_PLT32 0000000000000000 _Z6printxi - 4
...
Symbol table '.symtab' contains 25 entries:
Num: Value Size Type Bind Vis Ndx Name
...
20: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _Z6printxi
...
readelf -a printx.cpp
...
Symbol table '.symtab' contains 24 entries:
Num: Value Size Type Bind Vis Ndx Name
...
14: 0000000000000000 75 FUNC GLOBAL DEFAULT 1 _Z6printxi
...
l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]
Не понятно что она делает и как ее реализовать.
#include <stddef.h>
struct list {
struct list *next;
};
struct list *map(void f(struct list *p), struct list *l)
{
struct list *i;
for (i = l; i != NULL; i = i->next)
f(i);
return l;
}
struct list_int {
struct list list;
int i;
};
void process_int(struct list *l)
{
struct list_int *p = (struct list_int *)l;
++p->i;
}
int main()
{
struct list_int l[] = {
[0] = {
.list.next = &l[1].list,
.i = 1,
},
[1] = {
.i = 2,
},
};
map(process_int, &l[0].list);
}
cmd1 | cmd2 | cmd3
В данном примере все три команды делят между собой ресурсы одного ядра процессора.
cmd2 | cmd3
.