Сборка - Segfault при изменении памяти [дубликат]

Я изменил решение Andre 'Fi':

  function Enum() {
    var that = this;
    for (var i in arguments) {
        that[arguments[i]] = i;
    }
    this.name = function(value) {
        for (var key in that) {
            if (that[key] == value) {
                return key;
            }
        }
    };
    this.exist = function(value) {
        return (typeof that.name(value) !== "undefined");
    };
    if (Object.freeze) {
        Object.freeze(that);
    }
  }

Тест:

var Color = new Enum('RED', 'GREEN', 'BLUE');
undefined
Color.name(Color.REDs)
undefined
Color.name(Color.RED)
"RED"
Color.exist(Color.REDs)
false
Color.exist(Color.RED)
true
2
задан Jester 8 December 2012 в 15:33
поделиться

1 ответ

Как сказал Бо в своем комментарии, раздел .text доступен только для чтения по текущим системам. Чтобы этот код работал, вы должны сделать его доступным для записи. Например, вы можете использовать директиву в исходном файле:

.section wtext, "awx", @progbits

Эквивалентная nasm директива:

section wtext exec write

В качестве альтернативы, также можно передать -N переключиться на компоновщик.

Обратите внимание, что такой код оболочки обычно предназначен для выполнения стека, что является еще одной вещью, которая обычно отключается в текущих операционных системах. Если вы когда-нибудь захотите попробовать это в стеке, вам может понадобиться опция -z execstack компоновщика.

4
ответ дан Jester 26 August 2018 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: