Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51

Ошибка Segmentation fault: 11

31.10.2018, 00:03. Показов 3891. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! В данный момент пишу дипломную работу, хочу вызывать из Java c помощью JNI API данный ассемблерный код:
Опыт ассемблера не очень большой, поэтому основу кода позаимствовал с гитхаба, чтоб потом поменять, но пока хотел вообще попробовать запустить данный код. Но так как использую MacOS, то данный код необходимо было преобразовать из elf64 в macho64, что я и сделал с помощью утилиты objconv. Я скомпилировать код в elf64, после чего сконвертировал его в macho64 и успешно слинковал, но при запуске выдаётся следующая ошибка "Segmentation fault: 11". Как я понял, это связано с тем, что в исходном коде какой-то косяк с сегментами или похожее нечто, нужна помощь в поиске ошибки.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
;; Simple TCP echo server in x86_64 assembly, using Linux syscalls
;;
;;         nasm -felf64 -o server.o server.asm
;;        ld server.o -o server
;;         ./server
;;
 
global _main
 
;; Data definitions
struc sockaddr_in
    .sin_family resw 1
    .sin_port resw 1
    .sin_addr resd 1
    .sin_zero resb 8
endstruc
 
section .bss
    sock resw 2
    client resw 2
    echobuf resb 256
    read_count resw 2
 
section .data
    sock_err_msg        db "Failed to initialise socket", 0x0a, 0
    sock_err_msg_len    equ $ - sock_err_msg
 
    bind_err_msg        db "Failed to bind socket to listening address", 0x0a, 0
    bind_err_msg_len    equ $ - bind_err_msg
 
    lstn_err_msg        db "Failed to listen on socket", 0x0a, 0
    lstn_err_msg_len    equ $ - lstn_err_msg
 
    accept_err_msg      db "Could not accept connection attempt", 0x0a, 0
    accept_err_msg_len  equ $ - accept_err_msg
 
    accept_msg          db "Client connected!", 0x0a, 0
    accept_msg_len      equ $ - accept_msg
 
    ;; sockaddr_in structure for the address the listening socket binds to
    pop_sa istruc sockaddr_in
        at sockaddr_in.sin_family, dw 2            ; AF_INET
        at sockaddr_in.sin_port, dw 0xa1ed        ; port 60833
        at sockaddr_in.sin_addr, dd 0             ; localhost
        at sockaddr_in.sin_zero, dd 0, 0
    iend
    sockaddr_in_len     equ $ - pop_sa
 
section .text
 
;; Main entry point for the server.
_main:
    ;; Initialise listening and client socket values to 0, used for cleanup handling
    mov      word [sock], 0
    mov      word [client], 0
 
    ;; Initialize socket
    call     _socket
 
    ;; Bind and Listen
    call     _listen
 
    ;; Main loop handles clients connecting (accept()) then echoes any input
    ;; back to the client
    .mainloop:
        call     _accept
 
        ;; Read and re-send all bytes sent by the client until the client hangs
        ;; up the connection on their end.
        .readloop:
            call     _read
            call     _echo
 
            ;; read_count is set to zero when client hangs up
            mov     rax, [read_count]
            cmp     rax, 0
            je      .read_complete
        jmp .readloop
 
        .read_complete:
        ;; Close client socket
        mov    rdi, [client]
        call   _close_sock
        mov    word [client], 0
    jmp    .mainloop
 
    ;; Exit with success (return 0)
    mov     rdi, 0
    call     _exit
 
;; Performs a sys_socket call to initialise a TCP/IP listening socket, storing 
;; socket file descriptor in the sock variable
_socket:
    mov         rax, 41     ; SYS_SOCKET
    mov         rdi, 2      ; AF_INET
    mov         rsi, 1      ; SOCK_STREAM
    mov         rdx, 0    
    syscall
 
    ;; Check socket was created correctly
    cmp        rax, 0
    jle        _socket_fail
 
    ;; Store socket descriptor in variable
    mov        [sock], rax
 
    ret
 
;; Calls sys_bind and sys_listen to start listening for connections
_listen:
    mov        rax, 49                  ; SYS_BIND
    mov        rdi, [sock]              ; listening socket fd
    mov        rsi, pop_sa              ; sockaddr_in struct
    mov        rdx, sockaddr_in_len     ; length of sockaddr_in
    syscall
 
    ;; Check call succeeded
    cmp        rax, 0
    jl         _bind_fail
 
    ;; Bind succeeded, call sys_listen
    mov        rax, 50          ; SYS_LISTEN
    mov        rsi, 1           ; backlog (dummy value really)
    syscall
 
    ;; Check for success
    cmp        rax, 0
    jl         _listen_fail
 
    ret
 
;; Accepts a connection from a client, storing the client socket file descriptor
;; in the client variable and logging the connection to stdout
_accept:
    ;; Call sys_accept
    mov       rax, 43         ; SYS_ACCEPT
    mov       rdi, [sock]     ; listening socket fd
    mov       rsi, 0          ; NULL sockaddr_in value as we don't need that data
    mov       rdx, 0          ; NULLs have length 0
    syscall
 
    ;; Check call succeeded
    cmp       rax, 0
    jl        _accept_fail
 
    ;; Store returned fd in variable
    mov     [client], rax
 
    ;; Log connection to stdout
    mov       rax, 1             ; SYS_WRITE
    mov       rdi, 1             ; STDOUT
    mov       rsi, accept_msg
    mov       rdx, accept_msg_len
    syscall
 
    ret
 
;; Reads up to 256 bytes from the client into echobuf and sets the read_count variable
;; to be the number of bytes read by sys_read
_read:
    ;; Call sys_read
    mov     rax, 0          ; SYS_READ
    mov     rdi, [client]   ; client socket fd
    mov     rsi, echobuf    ; buffer
    mov     rdx, 256        ; read 256 bytes 
    syscall 
 
    ;; Copy number of bytes read to variable
    mov     [read_count], rax
 
    ret 
 
;; Sends up to the value of read_count bytes from echobuf to the client socket
;; using sys_write 
_echo:
    mov     rax, 1               ; SYS_WRITE
    mov     rdi, [client]        ; client socket fd
    mov     rsi, echobuf         ; buffer
    mov     rdx, [read_count]    ; number of bytes received in _read
    syscall
 
    ret
 
;; Performs sys_close on the socket in rdi
_close_sock:
    mov     rax, 3        ; SYS_CLOSE
    syscall
 
    ret
 
;; Error Handling code
;; _*_fail handle the population of the rsi and rdx registers with the correct
;; error messages for the labelled situation. They then call _fail to show the
;; error message and exit the application.
_socket_fail:
    mov     rsi, sock_err_msg
    mov     rdx, sock_err_msg_len
    call    _fail
 
_bind_fail:
    mov     rsi, bind_err_msg
    mov     rdx, bind_err_msg_len
    call    _fail
 
_listen_fail:
    mov     rsi, lstn_err_msg
    mov     rdx, lstn_err_msg_len
    call    _fail
 
_accept_fail:
    mov     rsi, accept_err_msg
    mov     rdx, accept_err_msg_len
    call    _fail
 
;; Calls the sys_write syscall, writing an error message to stderr, then exits
;; the application. rsi and rdx must be populated with the error message and
;; length of the error message before calling _fail
_fail:
    mov        rax, 1 ; SYS_WRITE
    mov        rdi, 2 ; STDERR
    syscall
 
    mov        rdi, 1
    call       _exit
 
;; Exits cleanly, checking if the listening or client sockets need to be closed
;; before calling sys_exit
_exit:
    mov        rax, [sock]
    cmp        rax, 0
    je         .client_check
    mov        rdi, [sock]
    call       _close_sock
 
    .client_check:
    mov        rax, [client]
    cmp        rax, 0
    je         .perform_exit
    mov        rdi, [client]
    call       _close_sock
 
    .perform_exit:
    mov        rax, 60
    syscall
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2018, 00:03
Ответы с готовыми решениями:

[C++/ASM] Segmentation fault
Есть прога на С++,где динамически создаются 3 массива int32_t одинакового размера. Есть на асме написаная функция которая к элементу...

Ошибка Segmentation Fault
При соединении сигнала QNetworkReply::finished или ReadyRead с любым слотом(даже пустым) вылетает ошибка Segmentation Fault. Если...

Ошибка Segmentation fault (11)
Всем привет! Сложилась такая ситуация что под виндой все прекрасно работает, а когда запускаю приложение на девайсе под андроидом...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
31.10.2018, 00:20
Начиная со строки 190 что-то интересное - то ли процедуры без ret то ли странное завершение программы - вызов _fail, а оттуда вызов _exit. Что-то напутано с вызовами.

Наилучший способ - выполнить программу в отладчике по шагам.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
31.10.2018, 00:24  [ТС]
ФедосеевПавел, Я не особо линуксоид, но не подскажете ещё, вообще в целом насколько адекватен код и системные вызовы?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
31.10.2018, 00:34
В целом нормально, но странный код начинается со строки 190.
И всё, что касается завершения программы (ошибочного или безошибочного) как-то странно выглядит по структуре - цепочка вызовов процедур.

А по вызовам Linux затрудняюсь ответить. Нет опыта.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
03.11.2018, 19:55
Ну там после 190 идут вызовы, которые не возвращаются, т.к. там закрытие всего и потом sys_exit, так что ret там и не нужен.
А по поводу ошибки – это нужно анализировать код, так сходу не скажу, тем более не знаю большую часть функций, которые здесь используются, надо рыться.
А зачем используется objconv, когда можно сразу в мачо скомпилить? NASM же поддерживает! Ключ -fmacho64. Беглым взглядом вроде косяков нет, но это беглым...
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
05.11.2018, 00:23  [ТС]
Jin X, знаю, я с этим ключом компилировал, но потом линкер ругался, маку нужен код написанный в его формате
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2018, 00:23
Помогаю со студенческими работами здесь

Ошибка Segmentation fault
Всем доброго дня. Люди добрые, помогите, кто чем может. При вызове метода hand.dealToPlayers(0) или hand.dealToPlayers(1) ошибок нет,...

Ошибка SIGSEGV(Segmentation fault)
Задание такое: Реализовать вычисления условных арифметических выражений c одномерными динамическими векторами, которые содержат...

Ошибка strcat ...segmentation fault
имеется функция показывает что segmentation fault(только в режиме дебага) в красных строках...а при компиляции ошибки не...

Ошибка segmentation fault и QMenu
День добрый! void CameraView::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { QMenu menu; QMenu...

Ошибка Segmentation fault (Core dumped)
Как избавится от ошибки Segmentation fault? Core dumped! на линукс, я предполагаю что это связано с выделениям памяти. #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru